Home > Article > Backend Development > Discussion on algorithm based on PHP WeChat red envelope_php example
On a whim, I sent a red envelope to the alumni WeChat group. I set the total amount of the red envelope to 10 yuan, and supported 28 people to receive it randomly.
Then an interesting result appeared:
A received 0.26 yuan
B received 0.29 yuan
C received 0.02 yuan
D received 0.56 yuan
E received 0.64 yuan
…
What algorithm does WeChat use to do this? I simply checked on Baidu and found that there is no official explanation yet. There is only a relatively popular discussion in Zhihu. Click here for the link. However, their discussion is too in-depth and seems to be a trap.
I tried it according to my own logic. This algorithm needs to meet the following requirements:
1. Everyone must be able to receive red envelopes;
2. The total amount of red envelopes received by each person = total amount;
3. The amount of red envelopes received by each person varies, but it cannot be too different, otherwise it will be uninteresting;
4. The algorithm must be simple, otherwise it will fail Tencent’s brand name;
Before formal coding, first build a progressive model to analyze the rules
The total amount is set to 10 yuan, and N people receive it randomly:
N=1
Then the amount of the red envelope = X yuan;
N=2
To ensure that the second red envelope can be issued normally, the amount of the first red envelope = a random number between 0.01 and 9.99
The second red envelope = 10-the amount of the first red envelope;
N=3
Red envelope 1=a random number between 0.01 and 0.98
Red envelope 2=a random number from 0.01 to (10-red envelope 1-0.01)
Red envelope 3=10-Red envelope 1-Red envelope 2
……
At this point, a pattern appears! Start coding!
Php code
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 元';
After inputting it, I found that the fluctuations are too big and the data is too boring!
The first red envelope: 7.48 yuan, balance: 2.52 yuan
The second red envelope: 1.9 yuan, balance: 0.62 yuan
The third red envelope: 0.49 yuan, balance: 0.13 yuan
The 4th red envelope: 0.04 yuan, balance: 0.09 yuan
The 5th red envelope: 0.03 yuan, balance: 0.06 yuan
The 6th red envelope: 0.03 yuan, balance: 0.03 yuan
The 7th red envelope: 0.01 yuan, balance: 0.02 yuan
The 8th red envelope: 0.02 yuan, balance: 0 yuan
Improve it and use the average value as the random safety upper limit to control the fluctuation difference
Php code
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 元';
The output results are shown in the picture below
The first red envelope: 0.06 yuan, balance: 9.94 yuan
The second red envelope: 1.55 yuan, balance: 8.39 yuan
The 3rd red envelope: 0.25 yuan, balance: 8.14 yuan
The 4th red envelope: 0.98 yuan, balance: 7.16 yuan
The 5th red envelope: 1.88 yuan, balance: 5.28 yuan
The 6th red envelope: 1.92 yuan, balance: 3.36 yuan
The 7th red envelope: 2.98 yuan, balance: 0.38 yuan
The 8th red envelope: 0.38 yuan, balance: 0 yuan
The above is the entire content of this article. I hope it will be helpful to everyone’s study. I also hope that everyone will support Script Home.