Генерация псевдослучайных чисел (линейный конгруэнтный метод)
Формула:
Примеры аргументов
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 C: Watcom, Digital Mars, CodeWarrior, IBM VisualAge C/C++[11] | 231 | 1103515245 | 12345 | bits 30..16 |
C99, C11: Suggestion in the ISO/IEC 9899[12] | 232 | 1103515245 | 12345 | bits 30..16 |
Borland Delphi, Virtual 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 CarbonLib, C++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;
}