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 ...
随机推荐
- JavaScript中调皮的undefined
JavaScript中调皮的undefined 在JavaScript中undefined只是一个标识符,不是关键字,这个很不靠谱的标识符还不能像其他符号一样随意使用,一方面是需要它的原始值保持不变, ...
- 【c++】编译器为我们实现了几个类成员函数?
#include <cassert> #include <complex> #include <iostream> class Empty{}; Empty e; ...
- WEBGIS网页崩溃问题分析
加载某一地区的系统页面时,过了几十秒,页面空白.曾经捕获到是WMTS服务异常的问题.本人推测可能是底图服务停止,使得WMTS服务无法进行而抛出的异常. 为了证实自己的猜想,鄙人对一个正常的系统,修改为 ...
- Vertica系列: 自动生成Identity 字段值的方法
参考 https://thisdataguy.com/2015/01/05/vertica-some-uses-of-sequences/ 在 vertica 中有三种定义 identity 字段的方 ...
- showMem.c setMem.c 及其改进
#ifndef MEMUTIL_H_INCLUDED #define MEMUTIL_H_INCLUDED // Show memory void showMem(void *, unsigned); ...
- redis整合Spring集群搭建及业务中的使用
1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...
- springboot08-jpa-mysql
1.主要pom依赖: <!--jpa--> <dependency> <groupId>org.springframework.boot</groupId&g ...
- tensorflow 学习1——tensorflow 做线性回归
. 首先 Numpy: Numpy是Python的科学计算库,提供矩阵运算. 想想list已经提供了矩阵的形式,为啥要用Numpy,因为numpy提供了更多的函数. 使用numpy,首先要导入nump ...
- [C++]线性链表之单链表
[文档整理系列] 线性链表之单链表 /* 问题描述:线性表____链表_____单链表 @date 2017-3-7 */ #include<iostream> using namespa ...
- Empirical Evaluation of Speaker Adaptation on DNN based Acoustic Model
DNN声学模型说话人自适应的经验性评估 年3月27日 发表于:Sound (cs.SD); Computation and Language (cs.CL); Audio and Speech Pro ...