PHP实现的随机红包算法示例


Posted in PHP onAugust 14, 2017

本文实例讲述了PHP实现的随机红包算法。分享给大家供大家参考,具体如下:

一、整体设计

算法有很多种, 可以自行选择, 主要的"架构" 是这样的, 用redis decr()命令去限流, 用mysql去记录各种需要的数据

二、红包算法

简便起见, 红包金额用整数表示, 假设每个红包里边有x个糖豆, 每个人最少一个豆

第一种: 每个红包的最大金额是: (剩余金额/剩余红包数)*2, 需要开始的时候预先分配给每个人一个豆

function randBean($total_bean, $total_packet)
{
  $min_bean = 1;
  $max_bean = 5000;
  $range = 2;
  $total_bean = $total_bean - $total_packet * $min_bean; //每个人预留一个最小值
  $list = [];
  $min = 1;
  while(count($list) < $total_packet){
    $max = floor($total_bean / $total_packet) * $range;
    $bean = rand($min, $max);
    if ($bean <= $max_bean - 1) {
      $list[] = $bean;
      $total_bean -= $bean;
    }
  }
  $list[] = $total_bean;//剩余的金豆作为最后一个红包
  //合并
  foreach ($list as $k => $v) {
    $list[$k] += $min_bean;
  }
  return $list;
}

多次统计

PHP实现的随机红包算法示例

第二种, 对其简单扩展一下, 每个红包的最大金额是: (剩余金额/剩余红包数)*3; 但是要求每次最少发2个红包

第三种, 线段法, 随机生成几个数字, 将一个直线分成几段, 每段的长度(这个波动比较大, 不是很平均, 如果限制了每个红包的大小, 会比较麻烦)

function abc ($total_bean, $total_packet)
{
  $min = 1;
  $max = $total_bean -1;
  $list = [];
  $maxLength = $total_packet - 1;
  while(count($list) < $maxLength) {
    $rand = mt_rand($min, $max);
    empty($list[$rand]) && ($list[$rand] = $rand);
  }
  $list[0] = 0; //第一个
  $list[$total_bean] = $total_bean; //最后一个
  sort($list); //不再保留索引
  $beans = [];
  for ($j=1; $j<=$total_packet; $j++) {
    $beans[] = $list[$j] - $list[$j-1];
  }
  // return $beans;
  echo '<pre>'; print_r($beans); echo array_sum($beans);
}
abc(100000, 3);

第四种:

因为每人最少1个豆, 那么每次随机生成豆数的时候要预留 剩余人数*1个豆;

去掉这些必须剩余的豆数后, 以剩下的豆数的平均值为最大值进行随机生成本次豆数

PHP 相关文章推荐
使用php+xslt在windows平台上
Oct 09 PHP
phpmyadmin 3.4 空密码登录的实现方法
May 29 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
php实现MySQL数据库备份与还原类实例
Dec 09 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
Jul 13 PHP
php中Redis的应用--消息传递
Mar 28 PHP
PHP实现正则匹配所有括号中的内容
Jun 22 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 PHP
php实现对短信验证码发送次数的限制实例讲解
Mar 04 PHP
详解PHP中的 input属性(隐藏 只读 限制)
Aug 14 #PHP
IOS 开发之NSDictionary转换成JSON字符串
Aug 14 #PHP
PHP+AjaxForm异步带进度条上传文件实例代码
Aug 14 #PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 #PHP
利用laravel+ajax实现文件上传功能方法示例
Aug 13 #PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 #PHP
php数据序列化测试实例详解
Aug 12 #PHP
You might like
php 获取全局变量的代码
2011/04/21 PHP
PHP多例模式介绍
2013/06/24 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
js类型检查实现代码
2010/10/29 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
Javascript 跨域知识详细介绍
2016/10/30 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
js实现开关灯效果
2020/03/30 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python实现类的创建与使用方法示例
2017/07/25 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
python使用KNN算法识别手写数字
2019/04/25 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
Python生成词云的实现代码
2020/01/14 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
如何利用python进行时间序列分析
2020/08/04 Python
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
建龙钢铁面试总结
2014/04/15 面试题
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
物流仓管员岗位职责
2015/04/01 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
世界十大狙击步枪排行榜
2022/03/20 杂记