Skip to main content

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

Формула:

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

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

Source m множитель a слагаемое c используемые биты
Numerical Recipes[9] 232 1664525 1013904223  
Borland C/C++ 232 22695477 1 bits 30..16 in rand(), 30..0 in lrand()
glibc (used by GCC)[10] 231 1103515245 12345 bits 30..0
ANSI CWatcomDigital MarsCodeWarriorIBM VisualAge C/C++[11] 231 1103515245 12345 bits 30..16
C99C11: Suggestion in the ISO/IEC 9899[12] 232 1103515245 12345 bits 30..16
Borland DelphiVirtual Pascal 232 134775813 1 bits 63..32 of (seed * L)
Microsoft Visual/Quick C/C++ 232 214013 (343FD16) 2531011 (269EC316) bits 30..16
Microsoft Visual Basic (6 and earlier)[13] 224 1140671485 (43FD43FD16) 12820163 (C39EC316)  
RtlUniform from Native API[14] 231 − 1 2147483629 (7FFFFFED16) 2147483587 (7FFFFFC316)  
Apple CarbonLibC++11's minstd_rand0[15] 231 − 1 16807 0 see MINSTD
C++11's minstd_rand[15] 231 − 1 48271 0 see MINSTD
MMIX by Donald Knuth 264 6364136223846793005 1442695040888963407  
Newlib 264 6364136223846793005 1 bits 63…32
VAX's MTH$RANDOM,[16] old versions of glibc 232 69069 1  
Java 248 25214903917 11 bits 47…16
Ранее во многих компиляторах:
RANDU 231   65539 0

Ссылки

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;
}