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 相关文章推荐
用Socket发送电子邮件(利用需要验证的SMTP服务器)
Oct 09 PHP
PHP分页显示制作详细讲解
Dec 05 PHP
PHP array_multisort()函数的使用札记
Jul 03 PHP
解析htaccess伪静态的规则
Jun 18 PHP
php获取指定日期之间的各个周和月的起止时间
Nov 24 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
php中的观察者模式简单实例
Jan 20 PHP
PHP浮点比较大小的方法
Feb 14 PHP
php微信公众平台交互与接口详解
Nov 28 PHP
Thinkphp整合微信支付功能
Dec 14 PHP
PHP PDOStatement::errorCode讲解
Jan 31 PHP
laravel与thinkphp之间的区别与优缺点
Mar 02 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的FTP学习(一)
2006/10/09 PHP
PHP使用数组实现队列
2012/02/05 PHP
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
Python读写配置文件的方法
2015/06/03 Python
python简单实现计算过期时间的方法
2015/06/09 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
spyder常用快捷键(分享)
2017/07/19 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
python plotly绘制直方图实例详解
2019/07/22 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
《第一朵杏花》教学反思
2014/04/16 职场文书
店铺转让协议书
2015/01/29 职场文书
超市员工管理制度
2015/08/06 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
mysqldump进行数据备份详解
2022/07/15 MySQL