You are on page 1of 13

Algoritmi i Strukture Podataka

Generatori
pseudoslučajnih brojeva
Generatori pseudoslučajnih brojeva

• Generator slučajnih brojeva: meri fizičku veličinu


za koju se pretpostavlja da je slučajne prirode

• Generator pseudoslučajnih brojeva: koristi neki algoritam


(najčešće baziran na celobrojnoj aritmetici)

• Pseudo = nije pravi : bazira se na algoritmudeterminizam

• Realizacija: hardverska ili softverska

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 2


Beograd
Generatori pseudoslučajnih brojeva

• Kvalitetan generator pseudoslučajnih brojeva


– dobre statističke karakteristike (uniformna raspodela generisanih
brojeva)
– velika perioda ponavljanja sekvence
• Primena
– simulacije realnih sistema (Monte-Carlo metode)
– kriptografija
– statističke analize
– sastavni su deo generatora pseudoslučajnih brojeva po drugim
raspodelama

– Bibliotečke funkcije jezika C


– rand() i srand() : loših karakteristika,
prihvatljivih samo za nebitne primene (video-igre)
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 3
Beograd
Generatori pseudoslučajnih brojeva - LKG

• Linearan kongruentan generator (LKG) periode m


X n 1  ( a  X n  c) mod m
0  m : moduo
0  a  m : množilac
0  c  m : inkrement
0  X 0  m : "klica" (eng. seed )
• (Donald Knuth) Perioda je m ako :
– c i m su uzajamno prosti
– a-1 je deljivo svim prostim činiocima m
– a-1 je umnožak 4 ako je m umnožak 4

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 4


Beograd
Generatori pseudoslučajnih brojeva - LKG

• Predložene kombinacije (32-bitni računar, m=232)


– a = 429493445, c = 907633385 (Knuth)
– a = 1664525, c = 1013904223 (Numerical Recipes in C)

• Kod (vraća realan broj od 0 do 1):

unsigned long u;
unsigned long iurng(void) {
return u = 429493445 * u + 907633385;
}
void SetSeed(unsigned long seed) double Randomd(void)
{ {
u = seed; return( iurng() / 4294967296.);
} }

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 5


Beograd
Poređenje: 100 000 tačaka (parovi X i Y)

Bibliotečka funkcija rand LKG (Knuth)


Visual C++ 2008
Generatori pseudoslučajnih brojeva - BBS

• Blum Blum Shub


Xn+1 = (Xn)2 mod M, gde je M=p*q,
p i q su prosti brojevi kongruentni sa 3 po modulu 4

– Nakon svake iteracije uzima se nekoliko bita Xn


kao deo rezultata (potrebno je više iteracija da bi se dobio jedan
pseudoslučajni broj)

• Generator je relativno spor (u odnosu na druge metode)


• Odlične karakteristike za kriptografiju, ne i za simulacije
(zbog sporosti)

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 7


Beograd
Generatori pseudoslučajnih brojeva - BBS

• Primer: p=11, q=19, X0=3, M=p*q=209.


=> X1=9, X2=81, X3=82, X4=36, X5=42, X6=92...

• Uzimamo npr. samo bit parnosti svakog člana, pa je


generisana sekvenca: 011010...

• Ako uzmemo najniži bit generisana sekvenca: 110000...

• Ove i slične sekvence se mogu kombinovati da se dobije


pseudoslučajni broj

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 8


Beograd
Generatori pseudoslučajnih brojeva - FGK

• Fibonačijev generator sa kašnjenjem


(eng. Lagged Fibonacci generator - LFG)
– Koristi način određivanja Fibonačijevih brojeva kao ideju:
Fn = Fn-1 + Fn-2

S n  ( S n  j  op  S n  k ) mod m, 0  j  k
 op je neka operacija (+ - * / xor)

• perioda zavisi od odabrane operacije


• j i k ne mogu da se biraju proizvoljno
(postoji objavljen spisak)
• problematična inicijalizacija (zavisno od vrednosti j i k)

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 9


Beograd
Zadatak
• Koristeći LKG generator implementirati funkciju coin()
koja sa približno jednakom verovatnoćom vraća
vrednosti 0 ili 1. Koristeći funkciju coin() implementirati
funkciju cube() koja simulira bacanje kocke, tj. vraća
vrednost od 1 do 6 sa približno podjednakim
verovatnoćama.

Elektrotehnički fakultet, Algoritmi i Strukture Podataka 10


Beograd
void InitCoin(unsigned long seed)
{
SetSeed(seed); //svodi se na inicijalizaciju LKG generatora
}
int coin() //ideja je da slučajno generišemo svaki bit
{ int cube()
double i=Randomd(); {
if(i<0.5) return 0; int i=coin();
else return 1; i = i*2 + coin();
} i = i*2 + coin();
if(i >= 6) return cube();
// ponovo pozovemo funkciju ako je rezultat
// veći nego što treba
else return i+1;
}
U test programu, u 60.000 poziva funkcije cube(), povratna vrednost iznosila je:
1 – 9.989 puta 4 – 9.972 puta
2 – 10.000 puta 5 – 9.924 puta
3 – 10.047 puta 6 – 10.068 puta
Elektrotehnički fakultet, Algoritmi i Strukture Podataka 11
Beograd
Zadatak

• Napisati program koji izračunava približnu vrednost


broja π primenom generatora slučajnih brojeva.

Ideja:
• Generisati slučajne brojeve kao
koordinate tačaka u ravni
(u prvom kvadrantu)
• Odnos broja tačaka u kvadratu
R=1 jedinične dužine stranica
i četvrtini kružnice
jediničnog poluprečnika
daje traženu (približnu) vrednost.
Rešenje
PROGRAM RAND(output); BEGIN
CONST MAX = 10000; j := 1;
VAR i, j : longint; FOR i := 1 to 7 DO
BEGIN
FUNCTION pi(i : longint) : real; j:=j*10;
VAR x, y,d : real; writeln(output, pi(j));
u_krugu, j : longint; END
BEGIN END.
u_krugu := 0;
d := MAX; Rezultati:
FOR j := 0 TO i DO i TP 7.0 VC++ 9
BEGIN 10 4 3.6
x := random(MAX)/d;
y := random(MAX)/d; 100 3.16 3.08
if sqr(x)+sqr(y)<=1.0 THEN 1000 3.152 3.084
u_krugu := u_krugu+1; 10000 3.1552 3.1132
END;
pi := 4.0 * u_krugu / i 100000 3.14324 3.13984
END; 1000000 3.141272 3.14014

You might also like