Avatar billede driis Nybegynder
16. august 2004 - 19:20 Der 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 ?
Avatar billede arne_v Ekspert
16. august 2004 - 21:07 #1
Det er vist et meget godt spørgsmål !

Ingen success med:

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()
    Dim r1 As Double
    Dim r2 As Double
    Dim r3 As Double
    Dim r4 As Double
    Dim r5 As Double
    Randomize
    r1 = Rnd
    Randomize (Timer)
    r2 = Rnd
    Randomize (GetTickCount)
    r3 = Rnd
    Randomize (Now)
    r4 = Rnd
    Randomize (0)
    r5 = Rnd
    MsgBox CStr(r1) & "  " & _
          CStr(r2) & "  " & _
          CStr(r3) & "  " & _
          CStr(r4) & "  " & _
          CStr(r5)
End Sub
Avatar billede tjacob Juniormester
20. august 2004 - 20:48 #2
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

    Rnd -1
    Randomize 10
    t1 = Rnd
    Rnd -1
    Randomize 10
    t2 = Rnd        GIVER t1 = t2

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)

Hvad den så er lig med ved jeg ikke :(

Håber det hjælper lidt    /tjacob
Avatar billede driis Nybegynder
20. august 2004 - 21:33 #3
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.
Avatar billede driis Nybegynder
20. august 2004 - 21:36 #4
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 ?
Avatar billede arne_v Ekspert
20. august 2004 - 21:41 #5
Jeg troede at GUID'er var opfundet for at løse det problem.
Avatar billede arne_v Ekspert
20. august 2004 - 21:41 #6
svar
Avatar billede arne_v Ekspert
20. august 2004 - 21:46 #7
sandsyneligheden for at den næste key bliver et duplikat må jo være

x / 2^32

men sandsyneligheden for at en af de næste y keys vil indeholde mindst en
duplikat er

1 - (1 - x / 2^32)^y

og der er pokker til forskel

x = 10000 y = 10000

10000 / 2^32 = 1 / 430000

1 - (1 - 10000 / 2^32)^10000 = 1 / 43
Avatar billede arne_v Ekspert
20. august 2004 - 21:50 #8
Men jeg har læst et sted at VB random generator kun bruger en 24 bit seed !

10000 / 2^24 = 1 / 1700

1 - (1 - 10000 / 2^24)^10000 = 1 (altså næsten sikkert)

NB: 1/430000, 1/43, 1/1700 og 1 er ikke eksakte men afrundet til et pænt tal.
Avatar billede tjacob Juniormester
21. august 2004 - 10:16 #9
Lige en kort bemærkning:

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
Avatar billede driis Nybegynder
21. august 2004 - 10:53 #10
tjacob: Nej, hvis programmet mellem 2 kørsler bliver Randomize'd med samme argument, vil 128 kald til Rnd give samme talkombination.
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
Kurser inden for grundlæggende programmering

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