web.cs.elte.huweb.cs.elte.hu/.../markus/infovalszam/velszamgen.docx · web viewazt, hogy egy...
TRANSCRIPT
A következőkben véletlen számok generálásával fogunk foglalkozni. Ezek az általunk készített
számok valójában „ ál- (pszeudo-)véletlenszámok”, hiszen egy meghatározott szabály szerint
képezzük őket egy adott véletlen kezdőértékből, a „ magból”. (Ezt általában a számítógép órája
alapján képzik). Lehetne „igazi” véletlen számokat is generálni a radioaktív bomlást vagy a
kvantumfizika egyéb jelenségeit használva, de ezek vagy nem volnának kellően hatékonyak,
vagy megvalósításuk ütközik technikai nehézségekbe.
A véletlen számokat általában 2-es számrendszerben adjuk meg, azaz véletlen 0,1 sorozatokkal.
Mikor jó egy véletlenszám-generátor? Könnyebb azt definiálni, hogy mikor rossz: akkor
mondjuk, hogy feltörhető, ha elegendő tag (mondjuk az első n ) ismeretében valaki hatékony
számolással, azaz polinomiális idő alatt meg tudja mondani vagy legalábbis tippelni, hogy mi
lesz a sorozat következő tagja. Ha valaki fel akarja törni a generátorunkat, akkor 1/2 esélye
biztos van rá, hogy eltalálja a következő jegyet (a korábbi jegyektől teljesen függetlenül,
pénzfeldobással tippelhet). Azt akarjuk, hogy ennél sokkal nagyobb esélye ne is legyen: azaz
polinomiális idő alatt senki se tudja megtenni.
Azt, hogy egy generátor megbízható-e ebben az értelemben, egyáltalában nem könnyű
ellenőrizni. Az egyik első képzési módot Neumann János adta meg: legyen pl. a mag x1 =
10101001 , képezzük ennek a négyzetét, és vegyük ki a középső 8 számjegyet, ez lesz x2 , majd
hasonlóan folytassuk az eljárást x2 -vel és így tovább. Ez a módszer azonban nem volt jó, mivel
viszonylag könnyen fel lehetett törni (sok esetben nagyon hamar periodikussá vált a sorozat).
Egy másik módszer a , vagy általánosabban (ahol az x mag egy viszonylag kicsi pozitív
egész szám) számjegyeinek a felhasználása, ami ugyan soha nem lesz periodikus, de más
okokból ugyancsak nem megfelelő. A gyakorlatban legtöbbet használt generátor a
kongruenciális generátor a következőképpen működik: legyen x a mag, A, B, illetve N pozitív
egészek, és xi=(Axi-1+B) mod N . Ez az eljárás könnyen programozható, gyors, és általában jó
eredményt ad, de a fenti szigorú elméleti követelményeknek nem felel meg (vagyis feltörhető).
Annál meglepőbb, hogy van ilyen értelemben „jó” véletlenszám-generátor is. Ehhez be kell
vezetnünk az egyirányú függvény fogalmát: Legyen f: N -› N egy-egyértelmű függvény, f -et
egyirányúnak nevezzük, ha f hatékonyan kiszámítható, de f-1 nem. A Goldreich–Levin féle
generátor egy ilyen egyirányú függvényt használ, és erről be lehet bizonyítani, hogy ezt a
sorozatot nem lehet feltörni polinomiális idő alatt.
Inverz eloszlásfüggvény módszer
Tétel: Legyen X val. vált., F(x) eloszlásfüggvénnyel, amely monoton növekedő és folytonos.
Ekkor
i. F(X) egyenletes eloszlású [0,1] –en
ii. Ha U ~ U(0,1) akkor F-1(U) eloszlásfüggvénye F(x) .
Pl.: Ha X ~ exp(λ) => F(x)=1-exp(- λx), => F-1(x)= -ln(1-x)/λ
-ln(1-U)/ λ ~ exp(λ), ahol U ~U(0,1)
Kiterjesztése: általánosított inverz: F-1(x)= inf{x | F(x)=y}
Elfogadás – elutasítás (Accept-reject) algoritmus
Legyen f(x) tetszıleges sűrűségfüggvény,g(x) pedig olyan sűrűségfüggvény, amelyre f(x) <
Mg(x), valamely M>1 esetén és g(x)-ből könnyen tudunk mintát venni (tipikus példa az
egyenletes eloszlás).
Algoritmus:
1. Vegyünk mintát: u~U(0,1) -ből, x~g(x) -ből
2. Ha u<f(x)/Mg(x), akkor x-et elfogadjuk
3. Különben elutasítjuk, és 1-be lépünk.