Heim >Backend-Entwicklung >PHP-Tutorial >Ich habe meine eigene zufällige Verteilung gefälschter roter WeChat-Umschläge geschrieben. Warum ist der durchschnittliche Unterschied so groß?
Ich hatte in diesen Tagen Zeit, also habe ich den Algorithmus der roten WeChat-Umschläge studiert. Ich habe es bei Du Niang überprüft und eine offizielle Antwort gesehen: „Zufälligerweise liegt der Betrag zwischen 0,01 und (verbleibender Durchschnitt 2).“ Mit anderen Worten, wenn jeder einen roten Umschlag erhält, kann sich der generierte Betrag reduzieren Die Speichernutzung und der Betrag jedes roten Umschlags liegen zwischen 0,01 und (verbleibender Durchschnitt 2). Das heißt, wenn es 5 rote Umschläge für 100 Yuan gibt, liegt das Geld des ersten roten Umschlags zwischen 0,01 und 40, aber jeder, der Red Envelope Grabbing gespielt hat, weiß, dass das falsch ist. Es kommt sehr häufig vor, dass man als Erster greift und mehr als den verbleibenden Durchschnitt * 2 bekommt.
Bevor ich diese Antwort sah, hatte ich die Idee, den Betrag nach dem Verteilen des roten Umschlags zu verteilen und dann darauf zu warten, dass jemand den roten Umschlag öffnet.
<code>public function index($money,$count){ if($count==1){ echo $money;exit; } $max=$money*100; if($max<$count){ echo '钱太少,人太多,不够分';exit; } $data=array(); $arr=array(); if($count==2){ $arr[]=mt_rand(1,$max-1); }else{ $a=range(1,$max-1); shuffle($a); $arr= array_rand($a,$count-1); } for($i=0;$i<=$count-1;$i++){ if($i==0){ $data[$i]=$arr[$i]; }elseif($i==$count-1){ $data[$i]=$max-$arr[$i-1]; }else{ $data[$i]=$arr[$i]-$arr[$i-1]; } $data[$i]=$data[$i]/100; //echo $data[$i].'<br/>'; } return $data; }</code>
Meine Idee ist, dass die Gesamtzahl der roten Umschläge der Länge einer geraden Linie entspricht und dann n-1 Punkte zufällig auf der geraden Linie platziert werden und der Abstand zwischen den Punkten der Menge jedes roten Umschlags entspricht Umschlag. Zuerst dachte ich, dass das relativ durchschnittlich wäre. Dann habe ich das Versenden von 10 roten Umschlägen für 100 Yuan getestet, und zwar 10.000 Mal, und festgestellt, dass
Und das ist das Ergebnis, nachdem ich die Sortierung der Punkte und Punktlängen durcheinander gebracht habe,
Wenn dies der Fall ist, ohne die vorherigen Ergebnisse zu verfälschen, wird der Unterschied noch größer sein.
Es ist deutlich zu erkennen, dass es weit vom Durchschnitt entfernt ist. Ist meine Vorstellung von vornherein falsch?
Ich hatte in diesen Tagen Zeit, also habe ich den Algorithmus der roten WeChat-Umschläge studiert. Ich habe es bei Du Niang überprüft und eine offizielle Antwort gesehen: „Zufälligerweise liegt der Betrag zwischen 0,01 und (verbleibender Durchschnitt 2).“ Mit anderen Worten, wenn jeder einen roten Umschlag erhält, kann sich der generierte Betrag reduzieren Die Speichernutzung und der Betrag jedes roten Umschlags liegen zwischen 0,01 und (verbleibender Durchschnitt 2). Das heißt, wenn es 5 rote Umschläge für 100 Yuan gibt, liegt das Geld des ersten roten Umschlags zwischen 0,01 und 40, aber jeder, der Red Envelope Grabbing gespielt hat, weiß, dass das falsch ist. Es kommt sehr häufig vor, dass man als Erster greift und mehr als den verbleibenden Durchschnitt * 2 bekommt.
Bevor ich diese Antwort sah, hatte ich die Idee, den Betrag nach dem Verteilen des roten Umschlags zu verteilen und dann darauf zu warten, dass jemand den roten Umschlag öffnet.
<code>public function index($money,$count){ if($count==1){ echo $money;exit; } $max=$money*100; if($max<$count){ echo '钱太少,人太多,不够分';exit; } $data=array(); $arr=array(); if($count==2){ $arr[]=mt_rand(1,$max-1); }else{ $a=range(1,$max-1); shuffle($a); $arr= array_rand($a,$count-1); } for($i=0;$i<=$count-1;$i++){ if($i==0){ $data[$i]=$arr[$i]; }elseif($i==$count-1){ $data[$i]=$max-$arr[$i-1]; }else{ $data[$i]=$arr[$i]-$arr[$i-1]; } $data[$i]=$data[$i]/100; //echo $data[$i].'<br/>'; } return $data; }</code>
Meine Idee ist, dass die Gesamtzahl der roten Umschläge der Länge einer geraden Linie entspricht und dann n-1 Punkte zufällig auf der geraden Linie platziert werden und der Abstand zwischen den Punkten der Menge jedes roten Umschlags entspricht Umschlag. Zuerst dachte ich, dass das relativ durchschnittlich wäre. Dann habe ich das Versenden von 10 roten Umschlägen für 100 Yuan getestet, und zwar 10.000 Mal, und festgestellt, dass
Und das ist das Ergebnis, nachdem ich die Sortierung der Punkte und Punktlängen durcheinander gebracht habe,
Wenn dies der Fall ist, ohne die vorherigen Ergebnisse zu verfälschen, wird der Unterschied noch größer sein.
Es ist deutlich zu erkennen, dass es weit vom Durchschnitt entfernt ist. Ist meine Vorstellung von vornherein falsch?
Sehen Sie, ob der Red-Envelope-Algorithmus hier Ihren Anforderungen entspricht
https://github.com/qieangel2013/yaf
Der WeChat-Betrag wird bei der Aufteilung in Echtzeit berechnet. Er verwendet eine reine Speicherberechnung und erfordert keinen Budget-Speicherplatz. Überlegungen zur Berechnung von Beträgen in Echtzeit: Das Budget erfordert Speicherplatz und die Echtzeiteffizienz ist sehr hoch.
Diese Antwort ist gut analysiert. Sie können http://coderroc.com/article/Mathematics and Algorithms/A Preliminary Study on WeChat Red Envelope Random Algorithm.html lesen.