RANDU

Z testwiki
Skočit na navigaci Skočit na vyhledávání
Pokud generovaná čísla bereme po trojicích jako souřadnice bodů, padnou do patnácti rovin, jak ukazuje tento trojrozměrný graf pro prvních sto tisíc hodnot

RANDU je lineární kongruentní generátor pseudonáhodných čísel Parkova-Millerova typu, který byl používán od šedesátých let dvacátého století. Je definován rekurentní rovnicí

Vj+1=65539Vjmod231

kde V0 je liché. Generuje pseudonáhodná celá čísla Vj v intervalu [1,2311].

RANDU je považován za jeden z nejhorších navržených a používaných generátorů pseudonáhodných čísel. Neprojde spektrálním testem pro dimenzi větší než 2, výsledkem jsou jen lichá čísla. Přesto se používal poměrně dlouho a na „náhodnosti“ jeho výstupu je založena řada vědeckých článků z počátku sedmdesátých let, kdy byl obzvlášť v oblibě.

Motivací pro volbu parametrů bylo, že na běžných počítačích lze velice rychle provést operace modulo 231 a násobení číslem 65539=216+21+1. První z nich lze realizovat vynulováním dvou nejvýznamnějších bitů 32bitového registru a druhou z nich lze realizovat jen pomocí sčítání a dvou bitových posunů, tedy aniž by bylo potřeba provádět obecné násobení.

Rychlým výpočtem ovšem výhody končí, neboť zvolené hodnoty vedou k velmi degenerované náhodnosti, jak vidíme z následujícího rozepsání rekurzivního vztahu (všechny následující výpočty probíhají modulo 231):

xk+2=(216+3)xk+1=(216+3)2xk

z čehož umocněním máme

xk+2=(232+6216+9)xk=[6(216+3)9]xk

kde zjednodušení plyne z toho, že 232mod216=0. Vidíme tedy, jak prostý je vztah mezi třemi po sobě následujícími hodnotami:

xk+2=6xk+19xk

Nedostatečnou náhodost generovaných čísel lze ukázat i obrázkem. Jak totiž ukázal v roce 1968 George Marsaglia, tak pokud generovaná čísla budeme brát po trojicích jako souřadnice bodů eukleidovského prostoru, pak všechny takto získané body padnou do pouhých patnácti rovin.[1]

Reference

Šablona:Překlad

Šablona:Autoritní data