Heim >Backend-Entwicklung >PHP-Tutorial >Ideen für PHP-Lotteriealgorithmen?
Es gibt einen schlechten Algorithmus im Internet. Weitere Informationen finden Sie unter dem Link
Das allgemeine Prinzip ist:
1, eine Zufallszahl generieren
2, die Wahrscheinlichkeit des N-ten Preises vergleichen
3, den Preis bestimmen;
Das Folgende ist der Algorithmus, den ich geschrieben habe:
1. Bestimmen Sie den Zahlenbereich für jeden Preis kann nur einmal einem bestimmten Preis zugeordnet werden
3, eine Glückszahl basierend auf dem Bereich generieren
4, den Preis basierend auf dem Bereich bestimmen;
Bitte fragen Sie die Experten, haben Sie bessere Algorithmen oder Ideen?
Antwortinhalt:
<code>$goods = [ 0 => [ 'id' => 1, 'name' => '苹果电脑', 'odds' => '0.01' //概率 ], 1 => [ 'id' => 2, 'name' => 'Iphone', 'odds' => '10.99' ], 2 => [ 'id' => 3, 'name' => '200元红包', 'odds' => '19' ], 3 => [ 'id' => 4, 'name' => '安慰奖', 'odds' => '30' ], 4 => [ 'id' => 5, 'name' => '什么都没抽到', 'odds' => '40' ], ]; $baseOdds = 100; //抽奖概率基数,默认100% $maxBase = 1; //抽奖概率基数倍数,默认1,如果奖品概率有小数位,该倍数为10的小数位数平方,具体看下面 foreach ($goods as $good) { $decimal = strpbrk($good['odds'], '.'); //获取小数点后面的内容 if ($decimal !== false) { $decimalCount = strlen($decimal) - 1;//获取小数点后面的位数 $newMaxBase = pow(10, $decimalCount); //例如概率如果是0.01,则全局的抽奖概率基数需要以10的平方倍数上涨 if ($newMaxBase > $maxBase) { $maxBase = $newMaxBase; //更新基数倍数 } } } $baseOdds = $maxBase ? $baseOdds * $maxBase : $baseOdds; //更新概率基数 $start = 1; $end = 0; $luckyCompare = $tickets = []; //为每个奖品生成一个幸运数区间 foreach ($goods as $key => $good) { $newOdds = $good['odds'] * $maxBase; $end = $end + $newOdds; $luckyCompare[$good['id']] = [$start, $end]; $tick = mt_rand($start, $end); $start = $start + $newOdds; $tickets[$good['id']] = $tick; } $luckyNumber = mt_rand(1, $baseOdds); var_dump($luckyNumber); var_dump($luckyCompare); foreach ($luckyCompare as $goodId => $compare) { if ($compare[0] <= $luckyNumber && $compare[1] >= $luckyNumber) { $luckyGood = $goodId; //最终的奖品 break; } } var_dump($luckyGood);</code>Es gibt einen schlechten Algorithmus im Internet. Weitere Informationen finden Sie unter dem Link
1, eine Zufallszahl generieren
2, die Wahrscheinlichkeit des N-ten Preises vergleichen3, den Preis bestimmen;
Wenn Sie diesem Algorithmus folgen, werden Sie subjektiv einmal einen Preis ziehen, aber objektiv wird jeder Preis einmal in einem Zyklus gezogen. Tatsächlich weiß ich nicht, ob mein Verständnis richtig ist .
Das Folgende ist der Algorithmus, den ich geschrieben habe:
3, eine Glückszahl basierend auf dem Bereich generieren
4, den Preis basierend auf dem Bereich bestimmen;Bitte fragen Sie die Experten, haben Sie bessere Algorithmen oder Ideen?
Alles was ich sagen kann ist hehe. Die Entscheidungsbefugnis des Lotteriealgorithmus liegt nicht beim Programmierer, das ist der Punkt.
Der Lotterie-Algorithmus ist also überhaupt nutzlos, solange die von Ihnen ausgeschütteten Preise den Preispool nicht überschreiten.
<code>$goods = [ 0 => [ 'id' => 1, 'name' => '苹果电脑', 'odds' => '0.01' //概率 ], 1 => [ 'id' => 2, 'name' => 'Iphone', 'odds' => '10.99' ], 2 => [ 'id' => 3, 'name' => '200元红包', 'odds' => '19' ], 3 => [ 'id' => 4, 'name' => '安慰奖', 'odds' => '30' ], 4 => [ 'id' => 5, 'name' => '什么都没抽到', 'odds' => '40' ], ]; $baseOdds = 100; //抽奖概率基数,默认100% $maxBase = 1; //抽奖概率基数倍数,默认1,如果奖品概率有小数位,该倍数为10的小数位数平方,具体看下面 foreach ($goods as $good) { $decimal = strpbrk($good['odds'], '.'); //获取小数点后面的内容 if ($decimal !== false) { $decimalCount = strlen($decimal) - 1;//获取小数点后面的位数 $newMaxBase = pow(10, $decimalCount); //例如概率如果是0.01,则全局的抽奖概率基数需要以10的平方倍数上涨 if ($newMaxBase > $maxBase) { $maxBase = $newMaxBase; //更新基数倍数 } } } $baseOdds = $maxBase ? $baseOdds * $maxBase : $baseOdds; //更新概率基数 $start = 1; $end = 0; $luckyCompare = $tickets = []; //为每个奖品生成一个幸运数区间 foreach ($goods as $key => $good) { $newOdds = $good['odds'] * $maxBase; $end = $end + $newOdds; $luckyCompare[$good['id']] = [$start, $end]; $tick = mt_rand($start, $end); $start = $start + $newOdds; $tickets[$good['id']] = $tick; } $luckyNumber = mt_rand(1, $baseOdds); var_dump($luckyNumber); var_dump($luckyCompare); foreach ($luckyCompare as $goodId => $compare) { if ($compare[0] <= $luckyNumber && $compare[1] >= $luckyNumber) { $luckyGood = $goodId; //最终的奖品 break; } } var_dump($luckyGood);</code>Manche Leute fragen sich vielleicht: Wie können wir die Fairness und Gerechtigkeit der Lotterie widerspiegeln? Tatsächlich besteht fast keine Notwendigkeit, dieses Problem zu berücksichtigen, da das Programm nach dem Schreiben automatisch ausgeführt wird. Zu diesem Zeitpunkt ist es eine gleichberechtigte Umgebung für alle Teilnehmer und es gibt kein unfaires Problem.
Der typische Pseudoalgorithmus ist wie folgt:
Rain and Dew Award: 5 Yuan Verbrauchsrabattgutschein, Gewinnquote 100 %;
Puddle Award: 10 Yuan Verbrauchsrabattgutschein, Gewinnquote 50 %; >Ben Thunder-Preis: 100-Yuan-Verbrauchsgutschein, Gewinnquote 5 %
Thunder-Preis: ein iPad, insgesamt 6.
Algorithmus: Der Mikrosekundenteil des Lotterie-Zeitstempels ist ein Vielfaches von 20 = Donner, und es ist eine ungerade Zahl = Pfütze, sonst ist es Regen und Tau. Alle zwei Stunden findet ein Zyklus statt, und der erste Lottogewinner zu Beginn des nächsten Zyklus gewinnt den Blitzpreis des vorherigen Zyklus. Die gesamte Veranstaltung ist nach Ablauf der Dauer vollständig beendet, wenn der erste Lottoschein eingeht.
Gibt es unfaire Fragen? Also, hehe. Am Ende müssen Sie immer noch Programme schreiben, die Ihren Bedürfnissen entsprechen.