基于PHP微信红包的算法探讨
突发奇想给校友微信群发了红包,我设定红包总额为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($min100,$safe_total100)/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($min100,$safe_total100)/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 元
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程