16. august 2004 - 19:20Der er
8 kommentarer og 2 løsninger
Randomize uden argument
Randomize initialiserer VB's funktioner til generering af tilfældige tal. Iflg. dokumentation, bruges "system timer" som seed, hvis intet angives. Hvilken værdi antager denne system timer ? Er det samme værdi som Windows funktionen GetTickCount ?
Jeg kan ikke svare på dit første spm, men kan dog forklare lidt:
arne_v's eksempel duer ikke umiddelbart. Hvis man ønsker en gentagen talsekvens vha argument til Randomize, skal den først 'nulstilles' ved at kalde Rnd med et negativt argument. Eksempelvis:
Randomize 10 t1 = Rnd Randomize 10 t2 = Rnd Giver IKKE t1 = t2, men
MEN, hvis man indsætter en række Rnd -1 i arne_v's eksempel får man STADIG ikke 2 ens tal. Heller ikke ved at anvende Time som seedværdi.
De forskellige funktioner returnerer følgende:
Timer : Antal sekunder siden midnat (med decimal -Single) Time : Tidspunkt i timer, minutter og sekunder. Hvis man sætter en Single (eller Double) variabel lig Time får man brøkdelen af dagen der gået. kl.12.00.00 = 0,5 kl.21.00.00 = 0,875 osv Now : Tidspunkt i dato, timer, minutter og sekunder. Jeg ved ikke Hvad Single-værdien udtrykker. GetTickCount : Antal millisekunder der er gået siden Windows blev startet i den aktuelle session.
Som nævnt får man IKKE 2 ens tal (og jeg HAR testet med GetTickCount, at der ikke går et 'tick' i den tid det tager at gennemløbe sub'en), så man kan i hvert tilfælde konkludere at denne 'system timer' IKKE er lig GetTickCount. (Eller Time, Timer, Now)
OK, jeg lukker spørgsmålet. I må gerne begge lægge et svar.
Spørgsmålet udsprang egentlig af at jeg har en applikation, som genererer (forhåbentlig) unikke keys som en 128 tegn lang streng hvor hvert tegn er valgt tilfældigt blandt 64 forskellige karakterer, vha. Rnd. Applikationen fejler, hvis der genereres 2 ens keys, og det er sket i ét tilfælde. Da jeg ikke selv har skrevet applikationen, ville jeg egentlig helst undgå at ændre i den, idet den har kørt upåklageligt i lang tid. Så jeg forsøgte at danne mig et overblik over, hvor sandsynligt det er, at der igen genereres 2 ens keys.
Men har jeg ret i følgende: Hvis vi antager at denne "system timer" er en 32 bit værdi, så er der 2^32 forskellige seed værdier - og ergo må sandsynligheden for at den samme key genereres 2 gange være 1:2^32. Jo flere keys jeg så opsamler, jo større bliver sandsynligheden for at jeg rammer én, som jeg allerede har brugt.
Er der nogen der kan fortælle mig, hvordan jeg beregner sandsynligheden for at ramme én af de allerede opsamlede keys, hvis der er 2^32 forskellige mulige seed værdier, og de alle er lige sandsynlige, og jeg i forvejen har opsamlet x keys ?
Jeg er ikke så 'stiv' i sandsynlighedsberegning, men det forekommer mig at i begge ignorerer tallet 128. Altså antallet af karakterer i nøglen. Det må da have indflydelse på disse beregninger? Nøglens størrelse er den mest afgørende faktor mht en krypterings styrke, eller hvad? Bortset fra det kan jeg vist ikke hjælpe videre.
tjacob: Nej, hvis programmet mellem 2 kørsler bliver Randomize'd med samme argument, vil 128 kald til Rnd give samme talkombination.
Synes godt om
Ny brugerNybegynder
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.