Heim > Backend-Entwicklung > PHP-Tutorial > Diskussion über den Algorithmus basierend auf dem Beispiel PHP WeChat redvelope_php

Diskussion über den Algorithmus basierend auf dem Beispiel PHP WeChat redvelope_php

WBOY
Freigeben: 2016-08-04 08:56:48
Original
847 Leute haben es durchsucht

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:

N=1

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 1=eine Zufallszahl zwischen 0,01 und 0,98

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




Nach der Eingabe stellte ich fest, dass die Schwankungen zu groß und die Daten zu langweilig waren!
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 元'; 
Nach dem Login kopieren
Der erste rote Umschlag: 7,48 Yuan, Restbetrag: 2,52 Yuan

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



Die Ausgabeergebnisse werden unten angezeigt
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 元'; 
Nach dem Login kopieren
Der erste rote Umschlag: 0,06 Yuan, Restbetrag: 9,94 Yuan

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.

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage