PHP随机红包算法
2017年1月14日 14:19:14 星期六
一, 整体设计
算法有很多种, 可以自行选择, 主要的"架构" 是这样的, 用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;
}
多次统计

第二种, 对其简单扩展一下, 每个红包的最大金额是: (剩余金额/剩余红包数)*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个豆;
去掉这些必须剩余的豆数后, 以剩下的豆数的平均值为最大值进行随机生成本次豆数
btw:
抢红包时用redis的一些原子性函数去限流, 然后用MySQL去记录数据
redis配合抢红包使用的函数(一个函数可以干两件事):
| 限制每个人只能抢一次 |
getSet(): 设置值并返回原来的值 setNx(): 如果不存在才设置 |
| 红包数量有限, 不能抢超 |
incr() incrBy() : 增加并返回增加后的值 decr() decrBy(): 减少并返回减少后的值 |
| 红包有效期 |
expire, setTimeout, pexpire(毫秒) expireAt, pexpireAt(毫秒) |
PHP随机红包算法的更多相关文章
- PHP实现微信随机红包算法和微信红包的架构设计简介
微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...
- php 随机红包算法
<?php /** * 红包分配算法 * * example * $coupon = new Coupon(200, 5); * $res = $coupon->handle(); * p ...
- php 固定红包 + 随机红包算法
<?php /** * 随机红包+固定红包算法[策略模式] * copyright (c) 2016 http://blog.csdn.net/CleverCode */ //配置传输数据DTO ...
- C# 随机红包算法
static void Main(string[] args) { ; ; double minAmount = 0.01; Random r = new Random(); ; i < num ...
- 微信红包随机生成算法(PHP版)
/** * 求一个数的平方 * @param $n */ function sqr($n){ return $n*$n; } /** * 生产min和max之间的随机数,但是概率不是平均的,从min到 ...
- 微信红包算法TEST
1.基本算法 设定总金额为10元,有N个人随机领取:N=1 则红包金额=X元: N=2 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数 第二个红包=10-第一个红包金 ...
- PHP实现微信红包算法和微信红包的架构设计简介
微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...
- php红包算法函数[优化]
php红包算法 <?php header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10000; ...
- php微信红包算法
微信红包算法.php /**生成红包的函数*/ function getRandMoney($totalMoney, $totalPeople=2, $miniMoney=1){ $randRemai ...
随机推荐
- 01-Unity深入浅出(一)
一. 温故而知新 在开始学习Unity框架之前,有必要温习一下 [依赖倒置原则]和[手写IOC], 因为我们框架代码的构建都是基于[依赖倒置原则]的,而Unity框架的核心思想就是IOC和DI,所以有 ...
- [Android] Android Studio 修改Gradle使用国内源
Gradle 仓库中心的项目,下载速度又比较慢, 网上查询了下, 使用阿里云的Maven镜像仓库 在 project 的 build.gradle中修改如下: allprojects { reposi ...
- 细说shiro之五:在spring框架中集成shiro
官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...
- Spring boot 工具类静态属性注入及多环境配置
由于需要访问MongoDB,但是本地开发环境不能直接连接MongoDB,需要通过SecureCRT使用127.0.0.2本地IP代理.但是程序部署到线上生产环境后,是可以直接访问MongoDB的,因此 ...
- TCP简单回射程序
一.程序功能 (1)客户从标准输入读入一行文本行,并写给服务器: (2)服务器从网络输入读入这行文本,并回射给客户: (3)客户从网络输入读入这行回射文本,并显示在标准输出上 二.服务器程序 #inc ...
- 练习:javascript弹出框及地址选择功能,可拖拽
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ES5新增内容
一.数组API实际开发中forEach和map会多一些=>是es6语法中的arrow function举例:(x) => x + 6相当于function(x){return x + 6; ...
- 采用shell脚本定时清理Tomcat日志
1 Shell脚本案例 删除超过30天的日志文件 #!/bin/bash log_path=/mnt/software/apache-tomcat-.M22/logs d=`date +%Y-%m-% ...
- 均方根误差(RMSE)与平均绝对误差(MAE)
RMSE Root Mean Square Error,均方根误差 是观测值与真值偏差的平方和与观测次数m比值的平方根. 是用来衡量观测值同真值之间的偏差 MAE Mean Absolute Erro ...
- Spring整合Web项目原理-理解不了,忽略