Heim >Backend-Entwicklung >PHP-Tutorial >Ideen für PHP-Lotteriealgorithmen?

Ideen für PHP-Lotteriealgorithmen?

WBOY
WBOYOriginal
2016-08-04 09:20:241433Durchsuche

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;

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:

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

Das allgemeine Prinzip ist:

1, eine Zufallszahl generieren

2, die Wahrscheinlichkeit des N-ten Preises vergleichen

3, 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:

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?



Alles was ich sagen kann ist hehe. Die Entscheidungsbefugnis des Lotteriealgorithmus liegt nicht beim Programmierer, das ist der Punkt.

Normalerweise werden Lotterieaktivitäten von der Marketingabteilung initiiert, geplant, ausgewertet und durchgeführt, und die Rolle der Programmierer besteht lediglich darin, sie umzusetzen. Der Marketing-Aktionsplan sollte Preiseinstellungen, Veranstaltungsdauer, Werbestrategie, kalte/heiße Zeit, Preisverteilungsstapel usw. umfassen. Vereinfacht ausgedrückt handelt es sich hier um eine Szene, die von der Marketingabteilung geleitet wird, und der Entwickler ist der Dirigent vor Ort . Das Programm ist für die Planung verantwortlich und der Lottogewinner ist der Schauspieler.

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.

Die Aktivitätszeit beträgt 12 Stunden und es gibt keine Obergrenze für Lottoscheine.

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.


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