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 相关文章推荐
php5 图片验证码实现代码
Dec 11 PHP
php学习笔记 类的声明与对象实例化
Jun 13 PHP
分享一个PHP数据流应用的简单例子
Jun 01 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
php+ajax实现文章自动保存的方法
Dec 30 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
Nov 25 PHP
PHP 数组遍历foreach语法结构及实例
Jun 13 PHP
PHP读书笔记整理_结构语句详解
Jul 01 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
Oct 29 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 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
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
PHP的FTP学习(四)
2006/10/09 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
PHP简单遍历对象示例
2016/09/28 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
从零学Python之入门(二)基本数据类型
2014/05/25 Python
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
CSS3实现内凹圆角的实例代码
2017/05/04 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
Sony C++笔试题
2013/03/10 面试题
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
shell变量的作用空间是什么
2013/08/17 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
周年庆典邀请函范文
2014/01/24 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
python基础之while循环语句的使用
2021/04/20 Python