Генераторы случайных чисел                          
31.5.97                                                                       
Алгоритм 1.                                                                   
Линейный конгруэнтный генератор (Лемер, 1948)                                 
Пусть m, a, c, x0 - целые числа, причем m>x0, m>a, m>c и x0>=0, a>=0, c>=0.   
Тогда псевдослучайное число из последовательности (xi) получается из          
предшествующего числа ему числа xi-1 как xi = (axi-1 + c) mod m               
                                                                              
При соответствующем выборе m, a, c и x0 алгоритм 1 выдает последовательность  
случайных чисел.  При c = 0 получается мультипликативный конгруэнтный         
генератор.                                                                    
                                                                              
Теорема 1.                                                                    
(Кармайкл, 1910)                                                              
Мультипликативный конгруэнтный генератор имеет период m-1 при выполнении      
следующих условий:                                                            
a) m - простое число;                                                         
б) a - первообразный корень из m, т.е. a^m = 1 mod m и для любого n < m a^n <>
1 mod m.                                                                      
                                                                              
для 32-битных целых чисел в качестве m можно взять m = 2^31 - 1 = 2147483647  
                                                                              
Алгоритм 2.                                                                   
Генератор на базе сдвигового регистра с обратной связью (Таусворт, 1965)      
Пусть ci (i=1,...,n) - множество целых чисел, имеющих значения 0 или 1, cn =  
1.  Тогда последовательность псевдослучайных чисел x = (xk) генерируется с    
помощью линейного рекуррентного соотношения                                   
            xk = (c1xk-1 + c2xk-2 + ... + cnxk-n) mod 2                       
                                                                              
Для периода равного 2^n - 1, необходимо и достаточно, чтобы полином           
            f(x) = 1 + c1x + c2x^2 + ... + x^n                                
являлся примитивным полиномом по модулю 2 над полем GF(2). Практически весь   
список примитивных полиномов над GF(2) ограничивается трехчленами вида        
            f(x) = x^p + x^q + 1,                                             
где p - показатель Мерсена (2^p - 1 является простым числом) и p > q > 0.     
Широко применяется полиномы при p = 250, q = 108 и p = 532, q = 37            
                                                                              
                                                                              


HyperText/CGI-HTML, v. 3.6.4 (C)1994-2000 M.Zakharov