基于PHP微信红包的算法探讨


Posted in PHP onJuly 21, 2016

突发奇想给校友微信群发了红包,我设定红包总额为10元,支持28个人随机领取。
于是一个有趣的结果出现了:
A 领取了 0.26元
B 领取了 0.29元
C 领取了 0.02元
D 领取了 0.56元
E 领取了 0.64元
……
微信是采用什么样的算法做到的?简单百度了下,目前尚未有官方的说明,仅仅在知乎里有一个较为热门的讨论,链接戳这里,不过他们讨论的太过于深入,有掉坑之嫌。
我按照自己的逻辑尝试了下,这个算法需要满足以下几点要求:
1、每个人都要能够领取到红包;
2、每个人领取到的红包金额总和=总金额;
3、每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味;
4、算法一定要简单,不然对不起腾讯这个招牌;
正式编码之前,先搭建一个递进的模型来分析规律
设定总金额为10元,有N个人随机领取:

N=1
则红包金额=X元;

N=2
为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数
第二个红包=10-第一个红包金额;

N=3
红包1=0.01至0.98之间的某个随机数
红包2=0.01至(10-红包1-0.01)的某个随机数
红包3=10-红包1-红包2

…… 
至此,规律出现啦!开始编码!
Php代码

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 
$total=10;//红包总额 
$num=8;// 分成8个红包,支持8人随机领取 
$min=0.01;//每个人最少能收到0.01元 
 
for ($i=1;$i<$num;$i++) 
{ 
 $safe_total=$total-($num-$i)*$min;//随机安全上限 
 $money=mt_rand($min*100,$safe_total*100)/100; 
 $total=$total-$money; 
 echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>'; 
} 
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

输入一看,波动太大,这数据太无趣了!
第1个红包:7.48 元,余额:2.52 元
第2个红包:1.9 元,余额:0.62 元
第3个红包:0.49 元,余额:0.13 元
第4个红包:0.04 元,余额:0.09 元
第5个红包:0.03 元,余额:0.06 元
第6个红包:0.03 元,余额:0.03 元
第7个红包:0.01 元,余额:0.02 元
第8个红包:0.02 元,余额:0 元 

改良一下,将平均值作为随机安全上限来控制波动差
Php代码

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 
$total=10;//红包总额 
$num=8;// 分成8个红包,支持8人随机领取 
$min=0.01;//每个人最少能收到0.01元 
 
for ($i=1;$i<$num;$i++) 
{ 
 $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限 
 $money=mt_rand($min*100,$safe_total*100)/100; 
 $total=$total-$money; 
 echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>'; 
} 
echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

输出结果见下图
第1个红包:0.06 元,余额:9.94 元
第2个红包:1.55 元,余额:8.39 元
第3个红包:0.25 元,余额:8.14 元
第4个红包:0.98 元,余额:7.16 元
第5个红包:1.88 元,余额:5.28 元
第6个红包:1.92 元,余额:3.36 元
第7个红包:2.98 元,余额:0.38 元
第8个红包:0.38 元,余额:0 元

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
使用PHP遍历文件目录与清除目录中文件的实现详解
Jun 24 PHP
有关于PHP中常见数据类型的汇总分享
Jan 06 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
php通过strpos查找字符串出现位置的方法
Mar 17 PHP
54个提高PHP程序运行效率的方法
Jul 19 PHP
PHP抽奖算法程序代码分享
Oct 08 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
Oct 09 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
PHP基于Redis消息队列实现发布微博的方法
May 03 PHP
Laravel使用Queue队列的技巧汇总
Sep 02 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 #PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 #PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
Jul 21 #PHP
PHP获取当前文件的父目录方法汇总
Jul 21 #PHP
功能强大的php分页函数
Jul 20 #PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 #PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 #PHP
You might like
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
PHP自动重命名文件实现方法
2014/11/04 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
jQuery 获取对象 定位子对象
2010/05/31 Javascript
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
Laravel admin实现消息提醒、播放音频功能
2019/07/10 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
python实现textrank关键词提取
2018/06/22 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
魅力教师事迹材料
2014/01/10 职场文书
旅游专业职业生涯规划范文
2014/01/13 职场文书
爱心捐助倡议书
2014/05/19 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
2014年减负工作总结
2014/12/10 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers