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

网络编程 2021-07-05 09:10www.168986.cn编程入门
微信群发红包大家都使用过吧,到底如何实现微信红包群发?这篇文章就为大家详细的揭晓答案,感兴趣的小伙伴们可以参考一下

突发奇想给校友微信群发了红包,我设定红包总额为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。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by