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通用检测函数集合
Nov 25 PHP
php mssql 日期出现中文字符的解决方法
Mar 10 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
PHP转换IP地址到真实地址的方法详解
Jun 09 PHP
深入PHP中的HashTable结构详解
Jun 13 PHP
PHP的curl实现get,post和cookie(实例介绍)
Jun 17 PHP
Yii2.0 模态弹出框+ajax提交表单
May 22 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 PHP
PHP PDOStatement::closeCursor讲解
Jan 30 PHP
Thinkphp页面跳转设置跳转等待时间的操作
Oct 16 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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
python简单实现AES加密和解密
2019/03/28 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
找工作最新求职信
2013/12/22 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS