Список генераторов случайных чисел — перечень наиболее известных алгоритмов и устройств, предназначенных для создания последовательностей чисел, близких по статистическим свойствам к случайным. Различают генераторы псевдослучайных чисел (ГПСЧ), основанные на детерминированных математических алгоритмах, и аппаратные генераторы (АГСЧ), использующие физические процессы в качестве источника случайности[1].
Как заметил Джон фон Нейман, «всякий, кто питает слабость к арифметическим методам получения случайных чисел, грешен вне всяких сомнений». Это выражение подчёркивает принципиальную невозможность получить «истинную» случайность с помощью конечного детерминированного алгоритма. Тем не менее ГПСЧ широко применяются в методах Монте-Карло, имитационном моделировании, криптографии и играх.
Алгоритмы в данном списке сгруппированы по типу лежащего в основе математического принципа.
Критерии качества генераторов
правитьНе существует универсального определения «хорошего» генератора случайных чисел: требования существенно различаются в зависимости от области применения. Для задач метода Монте-Карло важны длинный период и равномерность многомерного распределения, для криптографии — вычислительная непредсказуемость, для встроенных систем — скорость при минимальных ресурсах[2].
| Критерий | Описание | Особенно важен для |
|---|---|---|
| Период | Длина последовательности до начала повторения. Любой ГПСЧ с конечным состоянием рано или поздно зацикливается; чем больше период, тем лучше. | Все применения |
| Равномерность распределения | Насколько равномерно числа покрывают отрезок [0, 1) по одному измерению. | Моделирование, статистика |
| Равномерность в k измерениях | Равномерность при рассмотрении последовательных k-мерных векторов; критически важна для многомерных задач. | Метод Монте-Карло |
| Скорость генерации | Число чисел, генерируемых в единицу времени. Для высокопроизводительных вычислений измеряется в сотнях миллионов чисел в секунду. | HPC, игры, симуляция |
| Размер состояния | Объём памяти, необходимый для хранения внутреннего состояния генератора. | Встроенные системы |
| Криптографическая стойкость | Невозможность предсказать следующее число по предыдущим даже при знании алгоритма. Некриптографические ГПСЧ этим свойством не обладают. | Криптография, защита |
| Переносимость | Воспроизводимость одинаковой последовательности на разных платформах при одинаковом зерне. | Научные расчёты |
Для статистического тестирования ГПСЧ применяются стандартизованные наборы тестов. Наиболее известные из них — Diehard (разработан Дж. Марсаглия в 1995 году) и TestU01 (П. Лекуер и Р. Симар, 2007), включающий тест BigCrush из более чем 100 статистических проверок[3]. Провал даже одного теста из набора BigCrush считается серьёзным недостатком генератора.
Генераторы псевдослучайных чисел
правитьЛинейные конгруэнтные генераторы (LCG)
правитьЛинейный конгруэнтный метод был предложен Д. Г. Лемером в 1949 году и опубликован в 1951 году[4]. Генератор определяется рекуррентной формулой:
где — модуль, — множитель, — приращение, — начальное значение (зерно).
| Название | Модуль m | Множитель a | Приращение c | Применение |
|---|---|---|---|---|
| POSIX/glibc (rand) | 231 | 1 103 515 245 | 12 345 | C стандартная библиотека |
| Borland C/C++ | 232 | 22 695 477 | 1 | Компиляторы Borland |
| Microsoft Visual C++ | 232 | 214 013 | 2 531 011 | MSVC |
| Java (java.util.Random) | 248 | 25 214 903 917 | 11 | JDK |
| RANDU | 231 | 65 539 | 0 | IBM (устаревший, некачественный) |
Недостатком метода является зависимость последующих членов последовательности: последовательность неизбежно зацикливается, а период не превышает [1].
Генератор Лемера (мультипликативный LCG)
правитьЧастный случай при . Синоним: генератор Парка-Миллера[5]. Используется в Cray RANF (, ) и компьютерах Sinclair ZX81 (, ).
Регистры сдвига с линейной обратной связью (LFSR)
правитьРегистр сдвига с линейной обратной связью (англ. Linear Feedback Shift Register, LFSR) генерирует биты, вычисляя исключающее ИЛИ нескольких позиций регистра и сдвигая результат. При правильно выбранных позициях обратной связи достигается максимальный период , где — разрядность регистра[6].
LFSR-последовательности легко предсказываются с помощью алгоритма Берлекэмпа-Мэсси, поэтому не применяются в криптографии без дополнительной нелинейной обработки.
Вихрь Мерсенна (MT19937)
правитьВихрь Мерсенна (англ. Mersenne Twister, MT) — генератор, разработанный в 1997 году японскими учёными Макото Мацумото и Такудзи Нисимура[7]. Основан на линейной рекуррентности над полем GF(2).
Ключевые характеристики:
- Период: (числа Мерсенна).
- Равномерность в 623 измерениях (против ≤ 5 у стандартных LCG).
- Скорость: в 2-3 раза быстрее стандартных LCG-генераторов.
Вихрь Мерсенна является одним из наиболее широко используемых ГПСЧ в научных вычислениях и включён в стандартные библиотеки Python, Ruby, R, PHP и других языков. Недостаток: последовательность поддаётся восстановлению по 624 последовательным значениям.
Генераторы на основе XOR и сдвигов
правитьСемейство Xorshift (Марсаглия)
правитьВ 2003 году Джордж Марсаглия предложил семейство генераторов Xorshift, основанных исключительно на операциях исключающего ИЛИ и битовых сдвигов[8]. Генераторы чрезвычайно быстры и компактны, однако базовая форма xorshift проходит не все тесты из набора BigCrush.
Xoroshiro / Xoshiro (Блэкман, Винья)
правитьБолее современные модификации, разработанные Дэвидом Блэкманом и Себастьяно Виньей. xoroshiro128+ (2016) и xoshiro256** (2018) сочетают операции XOR, сдвига и ротации с нелинейной выходной функцией. Используются в Rust, Julia и ряде игровых движков.
Генераторы с перестановкой выхода (PCG)
правитьPCG (англ. Permuted Congruential Generator) — семейство ГПСЧ, предложенное М. Э. О’Нил в 2014 году. Основано на LCG с применением нелинейной функции перестановки к выходу. PCG превосходит вихрь Мерсенна по скорости при меньшем внутреннем состоянии и проходит все тесты BigCrush.
Генераторы на основе запаздывающего Фибоначчи (LFG)
правитьГенератор Фибоначчи с запаздыванием (англ. Lagged Fibonacci Generator, LFG) использует рекуррентное соотношение:
где — арифметическая или битовая операция (сложение, XOR и др.)[1]. Разновидности:
- Аддитивный LFG (ALFG) — использует сложение; входит в библиотеку SPRNG.
- Мультипликативный LFG (MLFG) — использует умножение.
Генераторы WELL
правитьWELL (англ. Well Equidistributed Long-period Linear) — семейство ГПСЧ, разработанное в 2006 году Ф. Панньтоном, П. Лекуером и М. Мацумото[9]. Генераторы серии WELL512, WELL1024, WELL19937 обеспечивают лучшее по сравнению с MT равномерное распределение и быстрее выходят из состояний с низкой энтропией («плохих» начальных значений).
Комбинированные генераторы
правитьКомбинированные генераторы объединяют несколько независимых ГПСЧ для повышения качества последовательности. Примеры:
- MRG32k3a (Лекуер, 1999) — комбинированный MRG, входящий в состав библиотеки RngStream[10].
- Вихман-Хилл — комбинация трёх LCG-генераторов; реализован в ранних версиях Microsoft Excel.
Криптографически стойкие ГПСЧ (CSPRNG)
правитьДанная группа генераторов разработана для задач криптографии, где требуется вычислительная неотличимость от истинной случайности:
| Генератор | Основан на | Стандарт / Применение |
|---|---|---|
| Yarrow | Хэш-функции, блочные шифры | Ранние версии macOS |
| Fortuna | AES, SHA-256 | macOS, FreeBSD (/dev/random) |
| ChaCha20 | Потоковый шифр | Linux (/dev/urandom), OpenBSD |
| CTR_DRBG | AES-CTR | NIST SP 800-90A |
| Dual_EC_DRBG | Эллиптические кривые | NIST (отозван из-за уязвимости) |
Аппаратные генераторы истинно случайных чисел (TRNG/HRNG)
правитьАппаратный генератор случайных чисел использует физические источники энтропии, которые принципиально непредсказуемы:
- Тепловой шум — флуктуации напряжения в резисторе.
- Дробовой шум — случайность движения носителей заряда.
- Радиоактивный распад — регистрация времён между распадами атомов.
- Квантовый вакуум — флуктуации электромагнитного поля.
- Физические процессы в ОС — Linux /dev/random, Windows CryptGenRandom.
Известные реализации в процессорах:
| Название | Производитель | Принцип |
|---|---|---|
| RdRand | Intel (Ivy Bridge, 2012) | Тепловой шум в кремниевой схеме |
| RNDRRS | ARM (ARMv8.5-A) | Встроенный TRNG |
| RDRAND | AMD | Аналог Intel RdRand |
Параллельные генераторы для суперкомпьютерных задач
правитьСуперкомпьютерные задачи моделирования методом Монте-Карло требуют генерации большого числа независимых потоков случайных чисел, по одному на каждый вычислительный процесс[11]. Для этого применяются специальные стратегии параллелизации:
- Разбиение периода (sequence splitting) — каждый процесс получает непересекающийся отрезок единого длинного периода.
- Скачок вперёд (jump-ahead) — быстрый переход в состояние, отстоящее на шагов.
- Независимые потоки (independent streams) — каждый процесс инициализируется разным зерном, обеспечивающим независимость потоков.
Библиотека SPRNG
правитьSPRNG (англ. Scalable Parallel Random Number Generators) — библиотека с открытым исходным кодом, разработанная для масштабных параллельных задач Монте-Карло на суперкомпьютерах[11]. Включает пять генераторов:
- Комбинированный MRG (Combined Multiple Recursive Generator).
- 48-битный LCG.
- 64-битный LCG.
- Модифицированный аддитивный LFG.
- Мультипликативный LFG.
Параллельный вихрь Мерсенна (dSFMT)
правитьdSFMT (англ. double precision SIMD-oriented Fast Mersenne Twister) — оптимизированная версия вихря Мерсенна для SIMD-параллелизма, разработанная Мацумото и коллегами. Используется в задачах физического моделирования на GPU и многопроцессорных системах.
История
править| Год | Генератор | Автор(ы) | Основная идея |
|---|---|---|---|
| 1946 | Метод средины квадрата | Джон фон Нейман | Извлечение средних цифр квадрата предыдущего числа |
| 1951 | Линейный конгруэнтный метод | Д. Г. Лемер | Рекуррентная формула с умножением и взятием остатка |
| 1965 | Максимально длиннопериодный LFSR | Р. Голомб | Регистр сдвига с линейной обратной связью |
| 1997 | Вихрь Мерсенна | М. Мацумото, Т. Нисимура | Линейная рекуррентность в GF(2), период 219937−1 |
| 2000 | SPRNG | М. Маскагни, А. Сринивасан | Масштабируемая параллельная библиотека |
| 2003 | Xorshift | Дж. Марсаглия | Быстрые XOR-сдвиговые операции |
| 2006 | WELL | Ф. Панньтон, П. Лекуер, М. Мацумото | Улучшенная равномерность при длинных периодах |
| 2014 | PCG | М. Э. О’Нил | LCG с перестановкой выхода |
| 2018 | xoshiro256** | Д. Блэкман, С. Винья | XOR/сдвиг/ротация с нелинейной выходной функцией |
Применение
править- Метод Монте-Карло — численное интегрирование, молекулярная динамика, квантовая химия.
- Имитационное моделирование — дискретно-событийное моделирование, моделирование трафика.
- Криптография — генерация ключей, nonce, инициализирующих векторов.
- Игры и графика — процедурная генерация игровых миров, текстур, звука.
- Тестирование программного обеспечения — фаззинг, стресс-тестирование.
- Машинное обучение — инициализация весов, дропаут, аугментация данных.
См. также
править- Генератор псевдослучайных чисел
- Аппаратный генератор случайных чисел
- Вихрь Мерсенна
- Линейный конгруэнтный метод
- Метод Монте-Карло
- Криптографически стойкий генератор псевдослучайных чисел
- SPRNG
Примечания
править- ↑ 1 2 3 4 5 Кнут, Д. Искусство программирования. Том 2: Получисленные алгоритмы. — 3-е изд.. — Вильямс, 2007. — ISBN 978-5-8459-0081-4.
- ↑ 1 2 L'Ecuyer, P. Uniform random number generation. — 1994. — Т. 53. — С. 77–120. — doi:10.1007/BF02136827.
- ↑ L'Ecuyer, P.; Simard, R. TestU01: A C Library for Empirical Testing of Random Number Generators. — 2007. — Т. 33, № 4. — doi:10.1145/1268776.1268777.
- ↑ Lehmer, D. H. Mathematical methods in large-scale computing units. — Harvard University Press, 1951. — С. 141–146.
- ↑ Park, S. K.; Miller, K. W. Random number generators: good ones are hard to find. — 1988. — Т. 31, № 10. — С. 1192–1201. — doi:10.1145/63039.63042.
- ↑ Golomb, S. W. Shift Register Sequences. — Holden-Day, 1967.
- ↑ Matsumoto, M.; Nishimura, T. Mersenne twister: a 623-dimensionally equidistributed uniform pseudo-random number generator. — 1998. — Т. 8, № 1. — С. 3–30. — doi:10.1145/272991.272995.
- ↑ Marsaglia, G. Xorshift RNGs. — 2003. — Т. 8, № 14. — doi:10.18637/jss.v008.i14.
- ↑ Panneton, F.; L'Ecuyer, P.; Matsumoto, M. Improved long-period generators based on linear recurrences modulo 2. — 2006. — Т. 32, № 1. — С. 1–16. — doi:10.1145/1132973.1132974.
- ↑ L'Ecuyer, P. Good parameters and implementations for combined multiple recursive random number generators. — 1999. — Т. 47, № 1. — С. 159–164. — doi:10.1287/opre.47.1.159.
- ↑ 1 2 Mascagni, M.; Srinivasan, A. Algorithm 806: SPRNG: A scalable library for pseudorandom number generation. — 2000. — Т. 26, № 3. — С. 436–461. — doi:10.1145/358407.358427.
Литература
править- Кнут, Д. Искусство программирования. Том 2: Получисленные алгоритмы. — 3-е изд.. — Вильямс, 2007. — ISBN 978-5-8459-0081-4.
- Фергюсон, Н.; Шнайер, Б. Практическая криптография. — Диалектика, 2005. — 421 с. — ISBN 5-8459-0733-0.
- Matsumoto, M.; Nishimura, T. Mersenne twister: a 623-dimensionally equidistributed uniform pseudo-random number generator. — 1998. — Т. 8, № 1. — С. 3–30. — doi:10.1145/272991.272995.
- Mascagni, M.; Srinivasan, A. Algorithm 806: SPRNG: A scalable library for pseudorandom number generation. — 2000. — Т. 26, № 3. — С. 436–461. — doi:10.1145/358407.358427.
- Panneton, F.; L'Ecuyer, P.; Matsumoto, M. Improved long-period generators based on linear recurrences modulo 2. — 2006. — Т. 32, № 1. — С. 1–16. — doi:10.1145/1132973.1132974.
- L'Ecuyer, P.; Simard, R. TestU01: A C Library for Empirical Testing of Random Number Generators. — 2007. — Т. 33, № 4. — doi:10.1145/1268776.1268777.
Ссылки
править- PCG — A Better Random Number Generator — официальный сайт
- Mersenne Twister Home Page — официальный сайт авторов