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

Формула:

<figure class="wp-block-image" id="bkmrk--2">![X_{{n+1}}=(aX_{n}+c)~~{\bmod  ~}~m,](https://wikimedia.org/api/rest_v1/media/math/render/svg/e8ac4b3f0d4461a1706da6bcb103e7185ea71d4e)</figure>Примеры аргументов

<figure class="wp-block-table" id="bkmrk-source-m-%D0%BC%D0%BD%D0%BE%D0%B6%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%C2%A0a"><table><tbody><tr><th>Source</th><th>*m*</th><th>множитель *a*</th><th>слагаемое *c*</th><th>используемые биты</th></tr><tr><td>*[Numerical Recipes](https://ru.wikipedia.org/w/index.php?title=Numerical_Recipes&action=edit&redlink=1)*<sup>[\[9\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-9)</sup></td><td>2<sup>32</sup></td><td>1664525</td><td>1013904223</td><td> </td></tr><tr><td>[Borland](https://ru.wikipedia.org/wiki/Borland) C/C++</td><td>2<sup>32</sup></td><td>22695477</td><td>1</td><td>bits 30..16 in *rand()*, 30..0 in *lrand()*</td></tr><tr><td>[glibc](https://ru.wikipedia.org/wiki/Glibc) (used by [GCC](https://ru.wikipedia.org/wiki/GNU_Compiler_Collection))<sup>[\[10\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-10)</sup></td><td>2<sup>31</sup></td><td>1103515245</td><td>12345</td><td>bits 30..0</td></tr><tr><td>[ANSI C](https://ru.wikipedia.org/wiki/ANSI_C): [Watcom](https://ru.wikipedia.org/wiki/Watcom_C_compiler), [Digital Mars](https://ru.wikipedia.org/w/index.php?title=Digital_Mars&action=edit&redlink=1), [CodeWarrior](https://ru.wikipedia.org/wiki/CodeWarrior), [IBM VisualAge](https://ru.wikipedia.org/wiki/IBM_VisualAge) C/C++<sup>[\[11\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-11)</sup></td><td>2<sup>31</sup></td><td>1103515245</td><td>12345</td><td>bits 30..16</td></tr><tr><td>[C99](https://ru.wikipedia.org/wiki/C99), [C11](https://ru.wikipedia.org/wiki/C11): Suggestion in the ISO/IEC 9899<sup>[\[12\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-12)</sup></td><td>2<sup>32</sup></td><td>1103515245</td><td>12345</td><td>bits 30..16</td></tr><tr><td>[Borland Delphi](https://ru.wikipedia.org/wiki/Borland_Delphi), [Virtual Pascal](https://ru.wikipedia.org/wiki/Virtual_Pascal)</td><td>2<sup>32</sup></td><td>134775813</td><td>1</td><td>bits 63..32 of *(seed \* L)*</td></tr><tr><td>[Microsoft Visual/Quick C/C++](https://ru.wikipedia.org/wiki/Visual_C%2B%2B)</td><td>2<sup>32</sup></td><td>214013 (343FD<sub>16</sub>)</td><td>2531011 (269EC3<sub>16</sub>)</td><td>bits 30..16</td></tr><tr><td>[Microsoft Visual Basic](https://ru.wikipedia.org/wiki/Visual_Basic) (6 and earlier)<sup>[\[13\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-13)</sup></td><td>2<sup>24</sup></td><td>1140671485 (43FD43FD<sub>16</sub>)</td><td>12820163 (C39EC3<sub>16</sub>)</td><td> </td></tr><tr><td>RtlUniform from [Native API](https://ru.wikipedia.org/wiki/Native_API)<sup>[\[14\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-14)</sup></td><td>2<sup>31</sup> − 1</td><td>2147483629 (7FFFFFED<sub>16</sub>)</td><td>2147483587 (7FFFFFC3<sub>16</sub>)</td><td> </td></tr><tr><td>[Apple CarbonLib](https://ru.wikipedia.org/w/index.php?title=CarbonLib&action=edit&redlink=1), [C++11](https://ru.wikipedia.org/wiki/C%2B%2B11)'s `minstd_rand0`<sup>[\[15\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-cpp11-15)</sup></td><td>2<sup>31</sup> − 1</td><td>16807</td><td>0</td><td>see [MINSTD](https://ru.wikipedia.org/w/index.php?title=MINSTD&action=edit&redlink=1)</td></tr><tr><td>[C++11](https://ru.wikipedia.org/wiki/C%2B%2B11)'s `minstd_rand`<sup>[\[15\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-cpp11-15)</sup></td><td>2<sup>31</sup> − 1</td><td>48271</td><td>0</td><td>see [MINSTD](https://ru.wikipedia.org/w/index.php?title=MINSTD&action=edit&redlink=1)</td></tr><tr><td>[MMIX](https://ru.wikipedia.org/wiki/MMIX) by [Donald Knuth](https://ru.wikipedia.org/wiki/%D0%9A%D0%BD%D1%83%D1%82,_%D0%94%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%B4_%D0%AD%D1%80%D0%B2%D0%B8%D0%BD)</td><td>2<sup>64</sup></td><td>6364136223846793005</td><td>1442695040888963407</td><td> </td></tr><tr><td>[Newlib](https://ru.wikipedia.org/wiki/Newlib)</td><td>2<sup>64</sup></td><td>6364136223846793005</td><td>1</td><td>bits 63…32</td></tr><tr><td>[VAX](https://ru.wikipedia.org/wiki/VAX)'s **MTH$RANDOM**,<sup>[\[16\]](https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4#cite_note-16)</sup> old versions of [glibc](https://ru.wikipedia.org/wiki/Glibc)</td><td>2<sup>32</sup></td><td>69069</td><td>1</td><td> </td></tr><tr><td>[Java](https://ru.wikipedia.org/wiki/Java)</td><td>2<sup>48</sup></td><td>25214903917</td><td>11</td><td>bits 47…16</td></tr><tr><td colspan="5">**Ранее во многих компиляторах:**</td></tr><tr><td>[RANDU](https://ru.wikipedia.org/wiki/RANDU)</td><td>2<sup>31</sup></td><td> 65539</td><td>0</td></tr></tbody></table>

</figure>Ссылки

[https://habr.com/ru/post/132217/](https://habr.com/ru/post/132217/)

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube.com/embed/-qLMTB61ZSs" width="560"></iframe>

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

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

```