En skikkelig PRNG (Pseudo-Random Number Generator) algoritme vil ha en syklus tid hvor det aldri vil være i samme tilstand. Hvis du utsetter hele delstaten PRNG i antall hentet fra det, vil du få en rekke garantert unik for perioden av generatoren.
En enkel PRNG som gjør dette kalles ' Linear kongruentrekursjonssekvens ' PRNG som itererer en formel:
X(i) = AX(i-1)|M
Bruke riktig par faktorer du kan få en periode på 2 ^ 30 (ca. 1 milliard) fra en enkel PRNG med en 32 bit akkumulator. Merk at du trenger en 64 bit lang lang midlertidig variabel å holde mellom 'AX' en del av beregningen. De fleste om ikke alle C-kompilatorer vil støtte denne datatypen. Du bør også være i stand til å gjøre det med en numerisk datatype på de fleste SQL-dialekter.
Med de riktige verdiene av A og M kan vi få et tilfeldig tall generator med gode statistiske og geometriske egenskaper. Det er en kjent papir om dette er skrevet av Fishman og Moore.
For M = 2 ^ 31-1 vi får bruke verdiene av A nedenfor for å få en PRNG med en fin lang periode (2 ^ 30 IIRC).
Gode verdier av A:
742,938,285
950,706,376
1,226,874,159
62,089,911
1,343,714,438
Merk at denne type generator er (per definisjon) ikke kryptografisk sikker. Hvis du vet det siste nummeret som genereres fra det du kan forutsi hva det vil gjøre videre. Dessverre tror jeg at du ikke kan få kryptografisk sikkerhet og garantert ikke-repeterbarhet på samme tid. For en PRNG å være kryptografisk sikker (f.eks Blum Blum Shub ) det kan ikke blottlegge tilstrekkelig tilstand i et generert tall for å tillate den neste nummer i sekvensen som skal forutsies. Derfor er den interne tilstanden er bredere enn det genererte tall og (for å ha god sikkerhet) det tar lengre tid enn antallet mulige verdier som kan bli generert. Dette betyr at den eksponerte nummeret ikke vil være unik innen fristen.
Av lignende grunner er det samme gjelder for langperiodiske generatorer som Mersenne Twister.