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 相关文章推荐
如何删除多级目录
Oct 09 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
php自定义的格式化时间示例代码
Dec 05 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
Apr 08 PHP
CodeIgniter读写分离实现方法详解
Jan 20 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
ThinkPHP开发--使用七牛云储存
Sep 14 PHP
php生成静态页面并实现预览功能
Jun 27 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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配置心得包含MYSQL5乱码解决
2006/11/20 PHP
php excel类 phpExcel使用方法介绍
2010/08/21 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
js 调整select 位置的函数
2008/02/21 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
类的返射机制中的包及核心类
2016/09/12 面试题
培训讲师开场白
2015/06/01 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
Mysql基础之常见函数
2021/04/22 MySQL
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Redis性能监控的实现
2021/07/09 Redis
图文详解Nginx版本平滑升级方案
2021/09/15 Servers