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 set_time_limit(0) 设置程序执行时间的函数
May 26 PHP
PHP验证码类代码( 最新修改,完全定制化! )
Dec 02 PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 PHP
php目录遍历函数opendir用法实例
Nov 20 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
PHP在线打包下载功能示例
Oct 15 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
PHP编程求最大公约数与最小公倍数的方法示例
May 29 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 PHP
php中用unset销毁变量并释放内存
May 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 发送带附件邮件示例
2014/01/23 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
Js切换功能的简单方法
2010/11/23 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
js的回调函数详解
2015/01/05 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
Python数据类型详解(四)字典:dict
2016/05/12 Python
tensorflow识别自己手写数字
2018/03/14 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
Python分类测试代码实例汇总
2020/07/23 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
大学生收银员求职信分享
2014/01/02 职场文书
股权收购意向书
2014/04/01 职场文书
工程材料采购方案
2014/05/18 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
大学生创业事迹材料
2014/12/30 职场文书
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers