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 相关文章推荐
分页显示Oracle数据库记录的类之一
Oct 09 PHP
PHP+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 PHP
php图片加中文水印实现代码分享
Oct 31 PHP
基于php验证码函数的使用示例
May 03 PHP
PHP大转盘中奖概率算法实例
Oct 21 PHP
PHP+jQuery+Ajax实现用户登录与退出
Apr 27 PHP
php简单判断文本编码的方法
Jul 30 PHP
PHP实现合并discuz用户
Aug 05 PHP
smarty中常用方法实例总结
Aug 07 PHP
yii用户注册表单验证实例
Dec 26 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
实例讲解通过​PHP创建数据库
Jan 20 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
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
jquery api参考 visualjquery 中国线路 速度快
2007/11/30 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
javascript innerText和innerHtml应用
2010/01/28 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
python学生信息管理系统实现代码
2019/12/17 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
创业计划书如何编写
2014/02/06 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
个人承诺书怎么写
2014/05/24 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
小学家长意见怎么写
2015/06/03 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python