16. november 2005 - 12:36Der er
16 kommentarer og 2 løsninger
Random er ikke noget der ligner random
Hej Alle.
Jeg var godt klar over at random() funktionen ikke var specielt random, men at det var så grelt som det er havde jeg ingen anelse om.
Hvordan sikrer jeg mig at når jeg kører en proces hvor der bliver genereret en hel masse random tal, at den så ikke vil være ens med en tilsvarende proces jeg for eksempel kører dagen efter på præcis samme tid.
Altså, hvordan danner jeg bedre random tal end med random funktionen?
Det gør du jo i princippet kun ved at gemme de gamle tal, hvis du vil være helt sikker, f.eks. i en database. Så må du køre et tjek på, om tallet har været der før, og hvis det har så lave et nyt, indtil det er helt unikt.
Altså hvis jeg forstår dig rigtigt, så er det ikke selve random-tallet der er problemet, men at det ikke bliver det samme tal flere gange? Og du bliver jo nødt til at definere et sted, hvilke tal du har brugt. PHP gemmer det jo ikke af sig selv, for funktionens funktion er jo at give dig et random tal, ikke at give dig et random tal der er unikt i forhold til noget nærmest ukendt :)
hvis du vil have noget unikt som gerne må indeholde blokbokstaver. så tag dog YYYYDDMMHHMMSS og md5 krypter... det tal vil aldrig komme igen. hvis du hiver det ud med date functionen... f.eks. md5(date("YmdHis"));
Er der en måde jeg kan generere randomtal ud fra md5krypteringen eller vil den komme til at indeholde bogstaver? Jeg har også set en funktion hvor man tager tiden med milisekunder - gør den ikke det med random i forvejen?
ja - problemet er at når den er brugt tilstrækkelig mange gange i en løkke genererer den ens sekvenser af random tal.
Synes godt om
Slettet bruger
22. november 2005 - 12:44#9
jaw: Problemet er ikke, at de enkelte tal er de samme, men at sekvenserne er ens. Dvs at man efter at have set på tallene over et stykke tid, kan forudse hvad det næste tal er.
Det er muligvis rigtigt. Men et f.eks. 5-cifret random tal, skal du da være ret skarp for at forudse?
Synes godt om
Slettet bruger
22. november 2005 - 19:19#11
Hvis du de sidste 5 gange du havde tallet 12345 bagefter fik 54321, 53142, 24135 osv i netop samme rækkefølge, så behøver man ikke være ret skarp. Det eneste, der kræves er, at man opdager det. Og en computer kan jo scriptes til den slags, og den husker godt.
Jo, men så er det vel netop lige præcis ikke random, hvis det følger et mønster? rand(0, 999999) vil vel give et random tal, som er random?
Synes godt om
Slettet bruger
22. november 2005 - 23:06#13
Nej, så er det lige netop ikke tilfældige tal - og det er det, der er problemet.
Computere er nemlig slet ikke gode til at lave tilfældige tal. De er slet ikke designet til at være tilfældige - og det er vi jo normalt ganske glade for.
Derfor skal man igennem en masse besværligheder for at få noget, der ligner tilfældige tal på en computer. Tilfældighedsgeneratoren kan f.eks benytte data om tiden mellem tastetryk i mikrosekunder som grundlag. Derudover kan man "seede" (eller "salte") tilfældighedsgeneratoren med en mere eller mindre unik værdi, som skal gøre de tilfældige tal mere tilfældige.
Efter version 4.2.0 af PHP bliver tilfældighedsgeneratoren automatisk seedet, men i ældre PHP-versioner skulle man selv gøre det. Det er det, srand()-funktionen gør.
Og det er absolut ikke kun PHP, der har dette problem. Hvis du i .NET skal slå med to terninger, skal du ikke benytte et Random-objekt til hver terning, men lave et enkelt objekt, som du så bruger til begge. Ellers vil de to terninger nemlig give samme serie af slag, og du vil dermed altid slå to ens. Lidt kedeligt at spille Matador, og blive smidt i fængsel for at køre for hurtigt hver eneste runde.
sandbox > Det kommer vel an paa hvad han skal bruge de tilfaeldige tal til. Hvis det er f.eks. til at lave et banner system goer det vel ikke noget at brugeren kan forudse det eller ej.
Men hvis det er til noget sikkerheds maessigt er det en anden snak.
Synes godt om
Slettet bruger
24. november 2005 - 16:57#15
Ja, det afhænger af opgaven om det er et problem. Da han har stillet spørgsmålet her, går jeg ud fra, at det er et problem i forbindelse med den opgave, han ønsker udført.
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.