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 ...
随机推荐
- HDU 6432(不连续环排列 ~)
题意是说在长度为 n 的环排列中,按照一定的方向(顺时针或逆时针),后一个数不能仅比前一个数大 1 , n 的下一个数不能是 1 ,问这种长度为 n 且本质不同(本质不同指环上数字的相对位置不同,如 ...
- zookeeper安装使用及工作原理分析
1. Zookeeper概念简介 Zookeeper是一个分布式协调服务:就是为用户的分布式应用程序提供协调服务,它是集群的管理者,监视着集群中各个节点的状态,根据节点提交的反馈进行下一步合理操作. ...
- sublime text3支持Vue文件高亮显示
sublime text 默认打开.vue文件全部都是白色的,不是特别方便.安装插件可以做到代码高亮显示 1.插件vue-syntax-highlight 下载地址:github https://gi ...
- spring注解第04课 @Import
1.beans package com.atguigu.bean; public class Blue { public Blue(){ System.out.println("blue.. ...
- 常用SQL语句大全总结
出处:http://www.cnblogs.com/0351jiazhuang/p/4530366.html SQL是(Structured Query Language)结构化查询语言的简称,下面赵 ...
- dll和lib的关系(转)
转自http://blog.163.com/zhengjiu_520/blog/static/3559830620093583438464/ 前面有一章说编译与链接的,说得很简略,其实应该放到这一章一 ...
- Debian Security Advisory(Debian安全报告) DSA-4404-1 chromium
Package : chromium CVE ID : CVE-2019-5786 Clement Lecigne在chromium的文件读取器实现中发现了一个use-after-free(释放后重用 ...
- cocos2dx 3.3 笔记
ccs3 加入了 rapidjson ->一个JSON解析库https://github.com/miloyip/rapidjson
- lua与C交互 具体
什么样类型的函数可以被Lua调用 typedef int (*lua_CFunction) (lua_State *L); 符合类型的函数怎样处理后才可以被Lua调用 使用lua_register或者 ...
- HDU-1018 BigNumber(斯特林近似)
题目链接 斯特林近似求数位长度经典题,更新板子顺手切了 #include <cstdio> #include <cmath> #include <cstring> ...