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中的string类型使用说明
Jul 27 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
php标签云的实现代码
Oct 10 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
一个显示效果非常不错的PHP错误、异常处理类
Mar 21 PHP
php魔术函数__call()用法实例分析
Feb 13 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
PHP之图片上传类实例代码(加了缩略图)
Jun 30 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
利用PHP判断文件是否为图片的方法总结
Jan 06 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 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类(查找/修改)xml文档
2013/03/26 PHP
php不写闭合标签的好处
2014/03/04 PHP
php获取图片信息的方法详解
2015/12/10 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
Prototype Array对象 学习
2009/07/19 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
pandas删除指定行详解
2019/04/04 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
使用Python实现画一个中国地图
2019/11/23 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
《猫》教学反思
2014/02/26 职场文书
会计工作决心书
2014/03/11 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
教师四风问题对照检查材料
2014/09/26 职场文书
2014年妇产科工作总结
2014/12/08 职场文书