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 array_slice函数的使用以及参数详解
Aug 30 PHP
PHP下10件你也许并不了解的事情
Sep 11 PHP
php 数组的指针操作实现代码
Feb 08 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
Sep 27 PHP
php查询相似度最高的字符串的方法
Mar 12 PHP
刷新PHP缓冲区为你的站点加速
Oct 10 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
开启PHP的伪静态模式
Dec 31 PHP
浅谈PHP中关于foreach使用引用变量的坑
Nov 14 PHP
php实现购物车产品删除功能(2)
Jul 23 PHP
PHP rsa加密解密算法原理解析
Dec 09 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
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
PHP 读取和编写 XML
2014/11/19 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
Python import自定义模块方法
2015/02/12 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
Python进程间通信Queue实例解析
2018/01/25 Python
详解python做UI界面的方法
2019/02/27 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
keras实现多种分类网络的方式
2020/06/11 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
超市营业员求职简历的自我评价
2013/10/17 职场文书
生产厂长岗位职责
2014/02/21 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
安全保证书
2015/01/16 职场文书
2015毕业设计工作总结
2015/07/24 职场文书