Heim  >  Artikel  >  Backend-Entwicklung  >  Diskussion zur Algorithmusimplementierung von WeChat Red Envelopes (basierend auf PHP)

Diskussion zur Algorithmusimplementierung von WeChat Red Envelopes (basierend auf PHP)

伊谢尔伦
伊谢尔伦Original
2016-11-26 17:10:451099Durchsuche

Heute Abend hatte ich eine plötzliche Idee und schickte einen roten Umschlag an die Alumni-WeChat-Gruppe. Ich legte den Gesamtbetrag des roten Umschlags auf 10 Yuan fest, sodass 28 Personen ihn nach dem Zufallsprinzip erhalten konnten.

Ein interessantes Ergebnis erschien:

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:

Jeder muss den roten Umschlag erhalten können; Jeder: Die Summe der von den einzelnen Personen erhaltenen Beträge für rote Umschläge ist unterschiedlich >

4. Der Algorithmus muss einfach sein, sonst schlägt die Tencent-Signatur fehl

Erstellen Sie vor der formalen Codierung zunächst ein progressives Modell, um die Regeln zu analysieren

Stellen Sie den Gesamtbetrag auf 10 ein Yuan, und N Personen werden es zufällig erhalten:

An diesem Punkt erscheint das Muster! Beginnen Sie mit dem Codieren!


Nach der Eingabe sind die Schwankungen zu groß, die Daten sind zu langweilig!
N=1 
则红包金额=X元; 
N=2 
为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数 
第二个红包=10-第一个红包金额; 
N=3 
红包1=0.01至0.98之间的某个随机数 
红包2=0.01至(10-红包1-0.01)的某个随机数 
红包3=10-红包1-红包2 
……

Verbessern Sie es und verwenden Sie den Durchschnittswert als zufällige Sicherheitsobergrenze, um die Schwankungsdifferenz zu kontrollieren
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 &#39;第&#39;.$i.&#39;个红包:&#39;.$money.&#39; 元,余额:&#39;.$total.&#39; 元 <br/>&#39;;
}
echo &#39;第&#39;.$num.&#39;个红包:&#39;.$total.&#39; 元,余额:0 元&#39;;

Die Ausgabeergebnisse sind in der folgenden Abbildung dargestellt
第1个红包:7.48 元,余额:2.52 元 
第2个红包:1.9 元,余额:0.62 元 
第3个红包:0.49 元,余额:0.13 元 
第4个红包:0.04 元,余额:0.09 元 
第5个红包:0.03 元,余额:0.06 元 
第6个红包:0.03 元,余额:0.03 元 
第7个红包:0.01 元,余额:0.02 元 
第8个红包:0.02 元,余额:0 元

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 &#39;第&#39;.$i.&#39;个红包:&#39;.$money.&#39; 元,余额:&#39;.$total.&#39; 元 <br/>&#39;;
}
echo &#39;第&#39;.$num.&#39;个红包:&#39;.$total.&#39; 元,余额:0 元&#39;;

Stellungnahme:
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