Aus einer Laune heraus habe ich einen roten Umschlag an die Alumni-WeChat-Gruppe geschickt. Ich habe den Gesamtbetrag des roten Umschlags auf 10 Yuan festgelegt, und 28 Personen können ihn nach dem Zufallsprinzip erhalten.
Dann erschien ein interessantes Ergebnis:
A erhielt 0,26 Yuan
B erhielt 0,29 Yuan
C erhielt 0,02 Yuan
D erhielt 0,56 Yuan
E erhielt 0,64 Yuan
……
Welchen Algorithmus verwendet WeChat dazu? Ich habe einfach bei Baidu nachgeschaut und festgestellt, dass es in Zhihu noch keine offizielle Erklärung gibt. Klicken Sie hier, um den Link zu lesen. Ihre Diskussion ist jedoch zu ausführlich und scheint eine Falle zu sein.
Ich habe es nach meiner eigenen Logik versucht. Dieser Algorithmus muss die folgenden Anforderungen erfüllen:
1. Jeder muss in der Lage sein, rote Umschläge zu erhalten
2. Die Gesamtzahl der roten Umschläge, die jede Person erhalten hat = Gesamtbetrag
3. Die Anzahl der roten Umschläge, die jede Person erhält, ist unterschiedlich, darf aber nicht zu unterschiedlich sein, sonst wird es uninteressant
4. Der Algorithmus muss einfach sein, sonst scheitert er an der Marke Tencent
Erstellen Sie vor der formalen Codierung zunächst ein progressives Modell, um die Regeln zu analysieren
Legen Sie den Gesamtbetrag auf 10 Yuan fest und N Personen erhalten ihn nach dem Zufallsprinzip:
Dann ist der Betrag des roten Umschlags = X Yuan;
N=2
Um sicherzustellen, dass der zweite rote Umschlag normal ausgegeben werden kann, ist der Betrag des ersten roten Umschlags = eine Zufallszahl zwischen 0,01 und 9,99
Der zweite rote Umschlag = 10 – der Betrag des ersten roten Umschlags;
N=3
Roter Umschlag 2=eine Zufallszahl von 0,01 bis (10-roter Umschlag 1-0,01)
Roter Umschlag 3=10-Roter Umschlag 1-Roter Umschlag 2
……
An diesem Punkt erscheint ein Muster! Beginnen Sie mit dem Codieren!
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 元';
Der zweite rote Umschlag: 1,9 Yuan, Restbetrag: 0,62 Yuan
Der dritte rote Umschlag: 0,49 Yuan, Restbetrag: 0,13 Yuan
Der 4. rote Umschlag: 0,04 Yuan, Restbetrag: 0,09 Yuan
Der 5. rote Umschlag: 0,03 Yuan, Restbetrag: 0,06 Yuan
Der 6. rote Umschlag: 0,03 Yuan, Restbetrag: 0,03 Yuan
Der 7. rote Umschlag: 0,01 Yuan, Restbetrag: 0,02 Yuan
Der 8. rote Umschlag: 0,02 Yuan, Restbetrag: 0 Yuan
Verbessern Sie es und verwenden Sie den Durchschnittswert als zufällige Sicherheitsobergrenze, um die Schwankung zu kontrollieren
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 元';
Der zweite rote Umschlag: 1,55 Yuan, Restbetrag: 8,39 Yuan
Der dritte rote Umschlag: 0,25 Yuan, Restbetrag: 8,14 Yuan
Der 4. rote Umschlag: 0,98 Yuan, Restbetrag: 7,16 Yuan
Der 5. rote Umschlag: 1,88 Yuan, Restbetrag: 5,28 Yuan
Der 6. rote Umschlag: 1,92 Yuan, Restbetrag: 3,36 Yuan
Der 7. rote Umschlag: 2,98 Yuan, Restbetrag: 0,38 Yuan
Der 8. rote Umschlag: 0,38 Yuan, Restbetrag: 0 Yuan
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich sein wird. Ich hoffe auch, dass jeder Script House unterstützt.