Luo 6 satunnaislukua arpajaisiin PHP: ssä

Tämä ohjelma tuottaa 6 satunnaislukua välillä 0-45 eikä numeroita voida toistaa. Voiko tätä koodia parantaa?

$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); 

Vastaa

Algoritmisi on toimiva, mutta se ei välttämättä ole kovin tehokas, ja se törmää enemmän ja useammin, jos lukumäärä kasvaa.

Yleensä on hienompaa aloittaa yksilöllisellä numerosarjalla ja poimia satunnainen näiden numeroiden valinta satunnaislukujen valitsemisen sijasta ja ainutlaatuisuuden testaaminen.

PHP tekee siitä suhteellisen siistin, koska siinä on sisäänrakennettu sekoitusfunktio (se tekee pohjimmiltaan Fisher-Yates sekoittaa samaa satunnaisjärjestelmää kuin sinäkin).

Joten, hae joukko ainutlaatuisia arvoja, sekoita se, tee valinta ja lajittele tulos:

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

Huomaa, että nimettyjen muuttujien käyttäminen vakioiden sijaan tekee se on selkeämpi mitä olet tekemässä.

Katso tämä käynnissä ideonella: https://ideone.com/1Hh0y8

Kommentit

  • 6 erillisen numeron luominen 45: stä ei todennäköisesti tarvitse enemmän satunnaislukuja kuin 45-elementtisen taulukon sekoittaminen edes törmäyksissä. Ja epäilen, että 6 ja 45 muuttuvat paljon tyypillisessä arpajaisissa.
  • @ 200_success – sovittu, ja vaikka ensimmäisessä lauseessani mainitaan tehokkuus, kyse on algoritmista, todellinen asia on siisteydestä, ja koodin toiminta. Myös kaksi pesimisen tasoa poistetaan yllä olevalla tavalla, ja lukuun ottamatta maagisen numeron ilmoituksia, se ' on nyt vain 4 koodiriviä.

vastaus

Muuttuja $i voidaan eliminoida, jos count($numbers), mikä vaatii operaattorin vaihtamisen <= -asetukseksi <.

while voidaan kirjoittaa uudelleen for -silmukaksi – esim.

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *