Ce programme génère 6 nombres aléatoires entre 0 et 45 et les nombres ne peuvent pas être répétés. Ce code peut-il être amélioré?
$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);
Réponse
Votre algorithme est fonctionnel, mais ce nest pas forcément très efficace, et il se heurtera davantage, et plus souvent si le nombre de nombres augmente.
Il est généralement plus simple de commencer avec un ensemble unique de nombres, et dextraire un nombre aléatoire sélection de ces nombres, au lieu de sélectionner des nombres aléatoires, et de tester lunicité.
PHP rend cela relativement soigné, car il a une fonction de lecture aléatoire intégrée (cela « fait essentiellement un mélange Fisher-Yates en utilisant le même système aléatoire que vous).
Donc, obtenir un tableau des valeurs uniques, mélangez-le, faites-en une sélection et triez le résultat:
$count = 6; $highball = 45; $numbers = range(0, $highball); shuffle($numbers); $drawn = array_slice($numbers, - $count); sort($drawn);
Remarque, lutilisation de variables nommées au lieu de constantes rend ce que vous faites est plus clair.
Regardez ceci sexécuter sur ideone: https://ideone.com/1Hh0y8
Commentaires
- Générer 6 nombres distincts sur 45 nest pas susceptible de nécessiter plus de nombres aléatoires que de mélanger un tableau de 45 éléments, même avec des collisions. Et je doute que 6 et 45 changeront beaucoup, pour une loterie typique.
- @ 200_success – daccord, et bien que ma première phrase mentionne lefficacité, cest à propos de lalgorithme, le vrai point est la netteté, et fonction du code. 2 niveaux dimbrication sont supprimés avec ce qui précède également, et en excluant les déclarations de nombres magiques, il ' nest plus que 4 lignes de code.
Réponse
La variable $i
pourrait être éliminée si count($numbers)
a été utilisé à la place, ce qui nécessiterait que lopérateur passe de <=
à <
.
La while
pourrait être réécrite comme une boucle for
– par exemple
for ($numbers = []; count($numbers) < 6; /* intentionally empty */ )