Список генераторов случайных чисел — перечень наиболее известных алгоритмов и устройств, предназначенных для создания последовательностей чисел, близких по статистическим свойствам к случайным. Различают генераторы псевдослучайных чисел (ГПСЧ), основанные на детерминированных математических алгоритмах, и аппаратные генераторы (АГСЧ), использующие физические процессы в качестве источника случайности[1].

Как заметил Джон фон Нейман, «всякий, кто питает слабость к арифметическим методам получения случайных чисел, грешен вне всяких сомнений». Это выражение подчёркивает принципиальную невозможность получить «истинную» случайность с помощью конечного детерминированного алгоритма. Тем не менее ГПСЧ широко применяются в методах Монте-Карло, имитационном моделировании, криптографии и играх.

Алгоритмы в данном списке сгруппированы по типу лежащего в основе математического принципа.

Критерии качества генераторов

править

Не существует универсального определения «хорошего» генератора случайных чисел: требования существенно различаются в зависимости от области применения. Для задач метода Монте-Карло важны длинный период и равномерность многомерного распределения, для криптографии — вычислительная непредсказуемость, для встроенных систем — скорость при минимальных ресурсах[2].

Основные критерии качества генераторов случайных чисел[1][2]
Критерий Описание Особенно важен для
Период Длина последовательности до начала повторения. Любой ГПСЧ с конечным состоянием рано или поздно зацикливается; чем больше период, тем лучше. Все применения
Равномерность распределения Насколько равномерно числа покрывают отрезок [0, 1) по одному измерению. Моделирование, статистика
Равномерность в k измерениях Равномерность при рассмотрении последовательных k-мерных векторов; критически важна для многомерных задач. Метод Монте-Карло
Скорость генерации Число чисел, генерируемых в единицу времени. Для высокопроизводительных вычислений измеряется в сотнях миллионов чисел в секунду. HPC, игры, симуляция
Размер состояния Объём памяти, необходимый для хранения внутреннего состояния генератора. Встроенные системы
Криптографическая стойкость Невозможность предсказать следующее число по предыдущим даже при знании алгоритма. Некриптографические ГПСЧ этим свойством не обладают. Криптография, защита
Переносимость Воспроизводимость одинаковой последовательности на разных платформах при одинаковом зерне. Научные расчёты

Для статистического тестирования ГПСЧ применяются стандартизованные наборы тестов. Наиболее известные из них — Diehard (разработан Дж. Марсаглия в 1995 году) и TestU01 (П. Лекуер и Р. Симар, 2007), включающий тест BigCrush из более чем 100 статистических проверок[3]. Провал даже одного теста из набора BigCrush считается серьёзным недостатком генератора.

Генераторы псевдослучайных чисел

править

Линейные конгруэнтные генераторы (LCG)

править

Линейный конгруэнтный метод был предложен Д. Г. Лемером в 1949 году и опубликован в 1951 году[4]. Генератор определяется рекуррентной формулой:

где  — модуль,  — множитель,  — приращение,  — начальное значение (зерно).

Параметры известных линейных конгруэнтных генераторов[1]
Название Модуль 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]. Включает пять генераторов:

  1. Комбинированный MRG (Combined Multiple Recursive Generator).
  2. 48-битный LCG.
  3. 64-битный LCG.
  4. Модифицированный аддитивный LFG.
  5. Мультипликативный 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/сдвиг/ротация с нелинейной выходной функцией

Применение

править

См. также

править

Примечания

править
  1. 1 2 3 4 5 Кнут, Д. Искусство программирования. Том 2: Получисленные алгоритмы. — 3-е изд.. — Вильямс, 2007. — ISBN 978-5-8459-0081-4.
  2. 1 2 L'Ecuyer, P. Uniform random number generation. — 1994. — Т. 53. — С. 77–120. — doi:10.1007/BF02136827.
  3. L'Ecuyer, P.; Simard, R. TestU01: A C Library for Empirical Testing of Random Number Generators. — 2007. — Т. 33, № 4. — doi:10.1145/1268776.1268777.
  4. Lehmer, D. H. Mathematical methods in large-scale computing units. — Harvard University Press, 1951. — С. 141–146.
  5. 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.
  6. Golomb, S. W. Shift Register Sequences. — Holden-Day, 1967.
  7. 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.
  8. Marsaglia, G. Xorshift RNGs. — 2003. — Т. 8, № 14. — doi:10.18637/jss.v008.i14.
  9. 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.
  10. 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.
  11. 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.

Ссылки

править

📚 Artikel Terkait di Wikipedia

Сортировка с помощью двоичного дерева

nullptr) visit_recursive(cur_node->right, visitor); } public: void visit(const Visitor& visitor) { if(m_root == nullptr) return; visit_recursive(m_root, visitor);

Сложение

XOR y=carry << 1; // left bitshift carry by one } return x; } // Recursive Algorithm int add(int x, int y){ return x if (y==0) else add(XOR(x, y) , AND(x

Рекуррентная нейронная сеть

естественного языка. Существуют также тензорные рекурсивные нейронные сети (RNTN, Recursive Neural Tensor Network), которые используют тензорные функции для всех

NSUCRYPTO

68—70. — doi:10.17223/2226308X/10/29. Ayat S., Ghahramani M. “A recursive algorithm for solving “a secret sharing” problem” (англ.) // Cryptologia. —

Обход дерева

with Graphs in MySQL Sample code for recursive and iterative tree traversal implemented in C. Sample code for recursive tree traversal in C#. Архивная копия

A*

(simplified MA*, SMA*) и рекурсивный поиск по первому наилучшему совпадению (recursive best-first search, RBFS). # Импортируем необходимые модули import heapq

Основная теорема о рекуррентных соотношениях

теорема неприменима. Теорема Акра-Баззи Duke University, "Big-Oh for Recursive Functions: Recurrence Relations". Архивная копия от 22 июня 2012 на Wayback

Крипке, Сол

«Semantical Analysis of Intuitionistic Logic I», In Formal Systems and Recursive Functions, edited by M. Dummett and J. N. Crossley. Amsterdam: North-Holland