27. august 2008 - 10:13Der er
13 kommentarer og 2 løsninger
Forskellige random tal
Faldt lige over spørgsmålet: Hvis jeg gerne vil have udskrevet 5 forskellige random tal på skærmen, hvordan gør jeg så? Man kan jo altid sige: $rand1 = rand(1,10); $rand2 = rand(1,10); $rand3 = rand(1,10); $rand4 = rand(1,10); while($rand1 == $rand2){ $rand1 = rand(1,10);} while($rand1 == $rand3){ $rand1 = rand(1,10);} osv, men det kommer bare til at fylde meget kodemæssig, så nogen der kender en anden løsning, evt en funktion? - Chris
Det er værd at bemærke at der er 2 principielle metoder: * den beskrevne - generer $min..$max, shuffle og pick $count * pick $count rand($min, $max) og repick hvis allerede picked
Den optimale metode afhænger af værdierne for $count, $max og $min. Generelt vil høj $count/($max-$min) favorisere shuffle mens lav vil favorisere test.
For 5/10 er der naturligvis ikke nogen målbar forskel.
arne_v: Gider du ikke give en lidt længere forklaring på, hvad forskellen er ? Og hvorfor der er en forskel ? Og hvis ikke det er at presse citronen for meget, et kode eksempel som beviser din påstand. :o)
Det er en forholdsvis dyr operation at create et range of shuffle dem når range ($max-$min+1) bliver stort mens det ikke gør den store forskel om hvorvidt man skal tage et lille eller stort antal ($count) ud af resultatet.
Modsat er generering af et random tal helt uafhængigt af range ($max-$min+1) mens til gengæld så koster det ved et simpelt test rigtigt dyrt for hver eneste pick at skulle løbe de allerede udtrukne numre igennem. Det kan kan man lave smartere. Men så render man ind i problemet at når $count nærmer sig ($max-$min+1) skal man trække rigtigt mange tilfældige numre for at finde et der ikke allerede er udtrukket.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.