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 相关文章推荐
一个数据采集类
Feb 14 PHP
php heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
奇怪的PHP引用效率问题分析
Mar 23 PHP
php代码书写习惯优化小结
Jun 20 PHP
调整PHP的性能
Oct 30 PHP
php使用pack处理二进制文件的方法
Jul 03 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
Oct 23 PHP
PHP实现简单的新闻发布系统实例
Jul 28 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
关于laravel 日志写入失败问题汇总
Oct 17 PHP
PHP autoload使用方法及步骤详解
Sep 05 PHP
PHP获取类私有属性的3种方法
Sep 10 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+DBM的同学录程序(4)
2006/10/09 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
js保存当前路径(cookies记录)
2010/12/14 Javascript
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
Python XML RPC服务器端和客户端实例
2014/11/22 Python
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
python动态文本进度条的实例代码
2020/01/22 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
python中添加模块导入路径的方法
2021/02/03 Python
自荐信写法介绍
2014/01/25 职场文书
通信工程专业求职信
2014/06/04 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
Java SSM配置文件案例详解
2021/08/30 Java/Android