Lineární kongruentní generátor

Lineární kongruentní generátor (anglicky Linear Congruential Generator, zkratka LCG) je jeden z nejstarších a nejjednodušších generátorů pseudonáhodných čísel.

Je definován vztahem:

,

kde operace mod znamená zbytek po celočíselném dělení, , a jsou vhodně zvolené konstanty. Počáteční nastavení se nazývá random seed („náhodné semínko“). Generátor generuje celá čísla s rovnoměrným rozložením v rozsahu . Poněvadž je počet možných hodnot v tomto rozsahu omezen, začne se nejpozději po vygenerovaných číslech opakovat stejná posloupnost (tzv. perioda generátoru). Generátor bude mít plnou periodu () právě tehdy, když:[1]

  1. a jsou nesoudělná čísla,
  2. je dělitelné všemi provočíselnými faktory ,
  3. je násobek 4, jestliže je násobek 4.
9000 hodnot (3000 bodů) vygenerovaných lineárním konguentním generátorem při špatně zvolených konstantách a, c, m. Je patrné, že body zdaleka nevyplňují celou krychli, ale leží pouze v 15 rovnoběžných rovinách.

Větší problém, než je periodicita generátoru, lze u tohoto typu generátoru pozorovat při generování náhodných bodů v prostoru. V případě špatně zvolených hodnot , , leží vygenerované body v několika rovnoběžných rovinách, zatímco zbytek prostoru, který by měl být rovnoměrně zaplněn, je prázdný. Nechvalně se tak proslavil například generátor RANDU (, , , je liché číslo) používaný okolo roku 1970.

Příklady konstant:

zdrojmacvýstup
Numerical Recipes1 664 5251 013 904 223
Borland C/C++22 695 4771bity 30–16 v rand(), 30–0 v lrand()
glibc (GCC)1 103 515 24512 345bity 30–0
ANSI C: Watcom, Digital Mars, CodeWarrior, IBM VisualAge C/C++1 103 515 24512 345bity 30–16
Borland Delphi, Virtual Pascal134 775 8131bity 63–32 ze (seed * L)
Microsoft Visual/Quick C/C++214 0132 531 011bity 30–16
Apple CarbonLib (Park & Miller)16 8070

Příklad v C

unsigned int x, a, c;

void Reset()
{
	x = 0; // Random seed (náhodné semínko)
	a = 69069;
	c = 1;
}

unsigned int GenerateNext()
{
	x = x*a + c;
	return x;
}

Související články

Reference

  1. D. E. Knuth. The Art of Computer Programming, Volume 2: Seminumerical Algorithms, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89684-2. str. 17–19.

Externí odkazy

Média použitá na této stránce

Randu2.png
9000 hodnot (3000 bodů) vygenerovaných generátorem RANDU. Je patrné, že body zdaleka nevyplňují celou krychli, ale leží pouze v 15 rovnoběžných rovinách.