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 相关文章推荐
hessian 在PHP中的使用介绍
Dec 13 PHP
超级实用的7个PHP代码片段分享
Jan 05 PHP
PHP的5个安全措施小结
Jul 17 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
基于php 随机数的深入理解
Jun 05 PHP
php统计时间和内存使用情况示例分享
Mar 13 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
PHP数组和explode函数示例总结
May 08 PHP
php自动识别文字编码并转换为目标编码的方法
Aug 08 PHP
php操纵mysqli数据库的实现方法
Sep 18 PHP
PHP使用Redis实现防止大并发下二次写入的方法
Oct 09 PHP
PHP简单实现防止SQL注入的方法
Mar 13 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
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
IE iframe的onload方法分析小结
2010/01/07 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
vue-cli 打包后提交到线上出现 &quot;Uncaught SyntaxError:Unexpected token&quot; 报错
2018/11/06 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
python如何让类支持比较运算
2018/03/20 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
Python文件读写常见用法总结
2019/02/22 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
详解python破解zip文件密码的方法
2020/01/13 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
中药专业大学生医药工作求职信
2013/10/25 职场文书
看雷锋电影观后感
2015/06/10 职场文书
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL
关于Python中进度条的六个实用技巧分享
2022/04/05 Python
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技