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 ...
随机推荐
- ACM-ICPC 2018 焦作赛区网络预赛 A Magic Mirror(签到)
https://nanti.jisuanke.com/t/31710 题意 若输入的是Jessie或jessie,输出Good guy!,否则输出Dare you say that again? 分析 ...
- java如何调用对方http接口(II)
java如何调用接口 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适,所以,问题来了,java如何调用接口?很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对 ...
- pytorch 学习--60分钟入个门
pytorch视频教程 标量(Scalar)是只有大小,没有方向的量,如1,2,3等 向量(Vector)是有大小和方向的量,其实就是一串数字,如(1,2) 矩阵(Matrix)是好几个向量拍成一排合 ...
- idea整合SVN以及SVN的使用
idea整合SVN以及SVN的使用: 1:下载插件: 运行并安装: 安装后的目录: 2-1 打开bin目录 :复制svn.exe的文件路径: 2:打开IDEA的File-->setting: o ...
- nginx接入let's encrypt
按以下步骤: 一.放开443端口 我的是云服务器,默认没开放443端口,需要先在控制台放开 二.使用let’s encrypt 生成证书 执行以下命令: git clone https://githu ...
- 计算机网络--HTTP协议
TCP/IP协议 互联网构建的初衷是信息的共享.在信息的传递过程中,计算机不可避免的需要产生交流.就像我们与别人交谈需要懂得对方的语言才能明白对方表达的意思一样,计算机的交流也需要一个约束了,称之为协 ...
- DevExpress 之 GridControl 自定义列
Ø 前言 DevExpress 控件大家应该都有所了解,使用这个框架实现B/S或C/S的,都是非常出色的.本文主要讨论下 GridControl 中如何[自定义列]或[计算列],可使用以下两种方法实 ...
- 彻底解决CDH5.12安装过程中 Error: JAVA_HOME is not set and Java could not be found
1 详细报错 + cat+======================================================================+| Error: JAVA_HO ...
- sonar的安装以及使用
SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,下面将会介绍一下这个工具的安装.配置以及使用. 1. 简介 1. sonar是什么 Sonar是一个用于代码质 ...
- ODS、DW和DM
参考资料: 数据仓库ODS.DW和DM概念区分:https://www.jianshu.com/p/72e395d8cb33