Generați 6 numere aleatorii pentru loterie în PHP

Acest program generează 6 numere aleatorii între 0 și 45 și numerele nu pot fi repetate. Poate fi îmbunătățit acest cod?

$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ăspuns

Algoritmul dvs. este funcțional, dar nu este neapărat foarte eficient și se va ciocni mai mult și mai des dacă numărul de numere crește.

În general, este mai bine să începeți cu un set unic de numere și să extrageți un număr aleatoriu. selectarea acelor numere, în loc de selectarea numerelor aleatorii și testarea pentru unicitate.

PHP face acest lucru relativ îngrijit, deoarece are o funcție de amestecare încorporată (care „face în esență o Fisher-Yates shuffle utilizând același sistem aleatoriu ca și voi).

Deci, obțineți o serie de valori unice, amestecați-o, alegeți o selecție și sortați rezultatul:

$count = 6; $highball = 45; $numbers = range(0, $highball); shuffle($numbers); $drawn = array_slice($numbers, - $count); sort($drawn); 

Notă, folosind variabile denumite în loc de constante face este mai clar ce faceți.

Vedeți acest lucru pe ideone: https://ideone.com/1Hh0y8

Comentarii

  • Generarea a 6 numere distincte din 45 nu este probabil să aibă nevoie de mai multe numere aleatorii decât amestecarea unei matrice de 45 de elemente, chiar și cu coliziuni. Și mă îndoiesc că 6 și 45 se vor schimba mult, pentru o loterie tipică.
  • @ 200_success – de acord și, deși prima mea propoziție menționează eficiența, adică despre algoritm, adevăratul punct este despre îngrijire, și funcția codului. 2 nivele de cuibărire sunt eliminate și cu cele de mai sus și, excluzând declarațiile de număr magic, ' acum sunt doar 4 linii de cod.

Răspuns

Variabila $i ar putea fi eliminată dacă count($numbers) a fost folosit în schimb, ceea ce ar necesita ca operatorul să fie schimbat din <= în <.

while ar putea fi rescris ca o buclă for – de ex.

for ($numbers = []; count($numbers) < 6; /* intentionally empty */ ) 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *