Dieses Programm generiert 6 Zufallszahlen zwischen 0 und 45 und die Zahlen können nicht wiederholt werden. Kann dieser Code verbessert werden?
$numbers = []; $i = 1; while($i <= 6) { $number = mt_rand(0, 45); if(!in_array($number, $numbers)) { array_push($numbers, $number); $i++; } } sort($numbers); echo implode(" - ", $numbers);
Antwort
Ihr Algorithmus ist funktionsfähig. Dies ist jedoch nicht unbedingt sehr effizient und kollidiert häufiger und häufiger, wenn die Anzahl der Zahlen zunimmt.
Es ist im Allgemeinen ordentlicher, mit einem eindeutigen Satz von Zahlen zu beginnen und einen Zufall zu extrahieren Auswahl dieser Zahlen anstelle von Zufallszahlen und Prüfung auf Eindeutigkeit.
PHP macht dies relativ ordentlich, da es eine integrierte Zufallsfunktion hat (das macht im Wesentlichen ein Fisher-Yates-Shuffle unter Verwendung des gleichen Zufallssystems wie Sie).
Also, Holen Sie sich ein Array der eindeutigen Werte, mischen Sie es, treffen Sie eine Auswahl und sortieren Sie das Ergebnis:
$count = 6; $highball = 45; $numbers = range(0, $highball); shuffle($numbers); $drawn = array_slice($numbers, - $count); sort($drawn);
Beachten Sie, dass benannte Variablen anstelle von Konstanten verwendet werden es wird klarer, was Sie tun.
Sehen Sie, wie dies auf ideone ausgeführt wird: https://ideone.com/1Hh0y8
Kommentare
- Das Generieren von 6 verschiedenen Zahlen aus 45 erfordert wahrscheinlich nicht mehr Zufallszahlen als das Mischen eines 45-Elemente-Arrays, selbst bei Kollisionen. Und ich bezweifle, dass sich 6 und 45 für eine typische Lotterie stark ändern werden.
- @ 200_success – stimmte zu, und obwohl mein erster Satz die Effizienz erwähnt, geht es um den Algorithmus, geht es bei dem eigentlichen Punkt um Ordentlichkeit. und Funktion des Codes. Mit den obigen Angaben werden auch zwei Verschachtelungsebenen entfernt. Mit Ausnahme der Deklarationen für magische Zahlen ' sind es jetzt nur noch 4 Codezeilen.
Antwort
Die Variable $i
könnte entfernt werden, wenn count($numbers)
verwendet, wodurch der Operator von <=
in <
geändert werden musste.
Die while
könnte als for
-Schleife umgeschrieben werden – z.
for ($numbers = []; count($numbers) < 6; /* intentionally empty */ )