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 相关文章推荐
如何提高MYSQL数据库的查询统计速度 select 索引应用
Apr 11 PHP
php,ajax实现分页
Mar 27 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
PHP内核介绍及扩展开发指南―基础知识
Sep 11 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
PHP MVC框架skymvc支持多文件上传
May 26 PHP
PHP之图片上传类实例代码(加了缩略图)
Jun 30 PHP
PHP实现留言板功能的详细代码
Mar 25 PHP
PHP连接及操作PostgreSQL数据库的方法详解
Jan 30 PHP
php+redis实现消息队列功能示例
Sep 19 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
phpwind中的数据库操作类
2007/01/02 PHP
mayfish 数据入库验证代码
2010/04/30 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Python如何获取文件路径/目录
2020/09/22 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
世界上最大的二手相机店:KEN
2017/05/17 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
销售部主管岗位职责
2013/12/18 职场文书
留学推荐信怎么写
2014/01/25 职场文书
四风问题对照检查材料
2014/09/22 职场文书
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android