基于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上传图片、删除图片实现代码
May 12 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
解析数组非数字键名引号的必要性
Aug 09 PHP
php实现的CSS更新类实例
Sep 22 PHP
php专用数组排序类ArraySortUtil用法实例
Apr 03 PHP
YII CLinkPager分页类扩展增加显示共多少页
Jan 29 PHP
微信利用PHP创建自定义菜单的方法
Aug 01 PHP
详解PHP中websocket的使用方法
Sep 15 PHP
phpcms中的评论样式修改方法
Oct 21 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
php实现的数组转xml案例分析
Sep 28 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 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
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
比较完整的微信开发php代码
2016/08/02 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
PHP实现的日历功能示例
2018/09/01 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
Python生成数字图片代码分享
2017/10/31 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
汽车装潢店创业计划书范文
2014/02/05 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
党员自评材料范文
2014/12/17 职场文书
协议书范文
2015/01/27 职场文书
小学校长开学致辞
2015/07/29 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android