Home  >  Article  >  Backend Development  >  Discussion on algorithm based on PHP WeChat red envelope_php example

Discussion on algorithm based on PHP WeChat red envelope_php example

WBOY
WBOYOriginal
2016-08-04 08:56:48811browse

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.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn