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中进行身份认证
Oct 09 PHP
无JS,完全php面向过程数据分页实现代码
Aug 27 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php实现的发送带附件邮件类实例
Sep 22 PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 PHP
php从字符串创建函数的方法
Mar 16 PHP
WordPress迁移时一些常见问题的解决方法整理
Nov 24 PHP
PHP中each与list用法分析
Jan 08 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
php动态读取数据清除最右边距的方法
Apr 12 PHP
如何在centos8自定义目录安装php7.3
Nov 28 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
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
php+mysql写的简单留言本实例代码
2008/07/25 PHP
PHP简单日历实现方法
2016/07/20 PHP
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
jquery动态添加option示例
2013/12/30 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
Python版的文曲星猜数字游戏代码
2013/09/02 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
2019年Java面试必问之经典试题
2012/09/12 面试题
委托公证书范本
2014/04/03 职场文书
社区春季防火方案
2014/06/02 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
关于工作经历的证明书
2014/10/11 职场文书
老公保证书怎么写
2015/02/26 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
《月光曲》教学反思
2016/02/16 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
MySQL数据库 安全管理
2022/05/06 MySQL