Skip to main content

Генерация псевдослучайных чисел (линейный конгруэнтный метод)

Формула:

 

X_{{n+1}}=(aX_{n}+c)~~{\bmod  ~}~m,

 

Примеры аргументов

 

Sourcemмножитель aслагаемое cиспользуемые биты
Numerical Recipes[9]23216645251013904223 
Borland C/C++232226954771bits 30..16 in rand(), 30..0 in lrand()
glibc (used by GCC)[10]231110351524512345bits 30..0
ANSI CWatcomDigital MarsCodeWarriorIBM VisualAge C/C++[11]231110351524512345bits 30..16
C99C11: Suggestion in the ISO/IEC 9899[12]232110351524512345bits 30..16
Borland DelphiVirtual Pascal2321347758131bits 63..32 of (seed * L)
Microsoft Visual/Quick C/C++232214013 (343FD16)2531011 (269EC316)bits 30..16
Microsoft Visual Basic (6 and earlier)[13]2241140671485 (43FD43FD16)12820163 (C39EC316) 
RtlUniform from Native API[14]231 − 12147483629 (7FFFFFED16)2147483587 (7FFFFFC316) 
Apple CarbonLibC++11's minstd_rand0[15]231 − 1168070see MINSTD
C++11's minstd_rand[15]231 − 1482710see MINSTD
MMIX by Donald Knuth26463641362238467930051442695040888963407 
Newlib26463641362238467930051bits 63…32
VAX's MTH$RANDOM,[16] old versions of glibc232690691 
Java2482521490391711bits 47…16
Ранее во многих компиляторах:
RANDU231  655390

 

Ссылки

https://habr.com/ru/post/132217/

Пример кода с проверкой цикличности неповторяемого блока:

#include <stdio.h>

unsigned long int seed = 1;
unsigned int lcg() {
    int a = 433494438;
    unsigned int m = 99999989;
    seed = seed * a % m; 
    
    return seed;
}   

int main() {
    unsigned int r = lcg(); 
    unsigned int n = 1; 
    while (lcg () != 433494438) { 
        n++;
    }
    printf("%d\n", n);
    
    return 0;
}