Avatar billede trophymanager Nybegynder
16. november 2005 - 12:36 Der 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?
Avatar billede jaw Nybegynder
16. november 2005 - 12:38 #1
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.
Avatar billede trophymanager Nybegynder
16. november 2005 - 12:40 #2
ok så reelt kan jeg kun sikre mig en form for cyklus med 'random' tal?
Avatar billede jaw Nybegynder
16. november 2005 - 12:42 #3
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 :)
Avatar billede net-base.dk Nybegynder
16. november 2005 - 13:40 #4
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"));
Avatar billede -kenner- Nybegynder
16. november 2005 - 22:29 #5
jeg bruger rand().
Avatar billede trophymanager Nybegynder
20. november 2005 - 23:12 #6
re netbase:

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?
Avatar billede -kenner- Nybegynder
20. november 2005 - 23:16 #7
md5() vil returnere baade tal og bogstaver, men jeg forstaar ikke hvorfor du ikke bare bruger rand($min,$max)

$min = den mindste vaerdi tallet maa vaere og $max = det hoejeste tal. Hvis du saa vil have mange af dem, saa skal du bare putte dem i en while().
Avatar billede trophymanager Nybegynder
22. november 2005 - 11:53 #8
ja - problemet er at når den er brugt tilstrækkelig mange gange i en løkke genererer den ens sekvenser af random tal.
Avatar billede 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.

trophymanager: Har du set på http://dk2.php.net/manual/da/function.srand.php
Avatar billede jaw Nybegynder
22. november 2005 - 16:06 #10
Det er muligvis rigtigt. Men et f.eks. 5-cifret random tal, skal du da være ret skarp for at forudse?
Avatar billede 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.
Avatar billede jaw Nybegynder
22. november 2005 - 19:23 #12
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?
Avatar billede 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.
Avatar billede -kenner- Nybegynder
24. november 2005 - 16:37 #14
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.
Avatar billede 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.
Avatar billede trophymanager Nybegynder
02. december 2005 - 23:03 #16
tak for hjælpen - smid et svar også sandbox så kan i dele :P
Avatar billede Slettet bruger
03. december 2005 - 10:08 #17
Kommer her.
Avatar billede -kenner- Nybegynder
03. december 2005 - 20:54 #18
Sandbox og hvem skal smid eet svar?
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester