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 相关文章推荐
一个程序下载的管理程序(三)
Oct 09 PHP
php 正则表达式小结
Aug 31 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
Admin generator, filters and I18n
Oct 06 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
Oct 15 PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 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脚本
2006/11/26 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
js实现打字小游戏
2019/12/17 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
详解Python中的type和object
2018/08/15 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
Python with语句和过程抽取思想
2019/12/23 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
python Xpath语法的使用
2020/11/26 Python
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
翻译学院毕业生自荐书
2014/02/02 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
公司财务部岗位职责
2015/04/14 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书