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 输出简单动态WAP页面
Jun 09 PHP
yii框架中的Url生产问题小结
Jan 16 PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
PHP常用的缓存技术汇总
May 05 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
php判断输入是否是纯数字,英文,汉字的方法
Mar 05 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
Dec 19 PHP
php输出图像的方法实例分析
Feb 16 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 PHP
PHP implode()函数用法讲解
Mar 08 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
PHP开发负载均衡指南
2010/07/17 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
Javascript 函数中的参数使用分析
2010/03/27 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
python通过线程实现定时器timer的方法
2015/03/16 Python
python实现简单购物商城
2016/05/21 Python
python rsa 加密解密
2017/03/20 Python
Python+Wordpress制作小说站
2017/04/14 Python
Python3计算三角形的面积代码
2017/12/18 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
网络教育毕业生自我鉴定
2013/10/10 职场文书
个人简历自我评价范文
2014/02/04 职场文书
学生期末评语大全
2014/04/30 职场文书
2015年员工工作总结范文
2015/04/08 职场文书