Mersenne Twister
Mersenne Twister (вихрь Мерсенна) — это генератор псевдослучайных чисел (ГПСЧ), разработанный в 1997 году японскими учёными Макото Мацумото и Такудзи Нисимурой. Относится к классу генераторов на основе регистров сдвига с линейной обратной связью. Основные характеристики: чрезвычайно длинный период (2^19937 − 1, что соответствует числу Мерсенна M19937), высокая скорость работы и хорошее статистическое качество выходной последовательности. Широко применяется в симуляциях, научных расчётах, компьютерной графике и криптографии (хотя не является криптостойким).
История
В 1990-х годах существовавшие ГПСЧ, такие как линейный конгруэнтный генератор (LCG) и регистры сдвига (например, Fibonacci LFSR), имели ограниченный период (обычно до 2^32) и проявляли статистические дефекты (корреляции между последовательными числами). Мацумото и Нисимура поставили цель создать генератор с периодом, близким к максимально возможному для 32-битных машин, и с равномерным распределением в 623 измерениях.
Алгоритм был опубликован в 1998 году в журнале ACM Transactions on Modeling and Computer Simulation. Название «Mersenne Twister» происходит от использования числа Мерсенна M19937 (2^19937 − 1) в качестве периода. Первоначальная реализация MT19937 (32-битная версия) быстро стала популярной благодаря включению в стандартные библиотеки языков программирования (C++, Python, R, MATLAB). В 2007 году вышла 64-битная версия MT19937-64, а в 2015 году — улучшенные варианты SFMT (SIMD-oriented Fast Mersenne Twister) и TinyMT.
Принцип работы
Основные компоненты
- Состояние: массив из 624 32-битных слов (для MT19937) или 312 64-битных слов (для MT19937-64).
- Индекс: указатель текущего слова в массиве (от 0 до 623).
- Параметры: константы, определяющие рекуррентное соотношение (например, 397, 2567483615).
Алгоритм
- Инициализация: состояние заполняется начальным значением (seed) — обычно 32-битным числом. Для этого используется линейный конгруэнтный генератор с фиксированными параметрами.
- Генерация последовательности:
- Для каждого слова из массива выполняется операция «скручивания» (twist):
- Берётся текущее слово, слово с отступом 397 и слово с отступом 1.
- Применяются битовые сдвиги, XOR и умножение на константу.
- Результат записывается на место текущего слова.
- После обработки всех 624 слов массив «скручивается» заново.
- Темперирование (tempering): к каждому сгенерированному слову применяется последовательность битовых операций (сдвиги, XOR, маски), чтобы улучшить статистическое распределение. Результат выдаётся как псевдослучайное число.
Период и равномерность
- Период равен 2^19937 − 1, что является простым числом Мерсенна. Это означает, что последовательность не повторяется до исчерпания периода, что в 10^6000 раз больше, чем у типичных LCG.
- Выходные числа равномерно распределены в 623-мерном пространстве (для 32-битной версии). Это свойство называется «623-мерная равномерность» и гарантирует отсутствие корреляций между группами из 623 последовательных чисел.
Разновидности
MT19937 (32-битная)
- Базовая версия с периодом 2^19937 − 1.
- Размер состояния: 624 слова (2,5 КБ).
- Скорость: ~100–200 млн чисел в секунду на современных процессорах.
MT19937-64 (64-битная)
- Аналогична MT19937, но использует 64-битные слова.
- Размер состояния: 312 слов (2,5 КБ).
- Период тот же, но выходные числа — 64-битные.
SFMT (SIMD-oriented Fast Mersenne Twister)
- Оптимизированная версия, использующая SIMD-инструкции (SSE2, AVX) для параллельной обработки.
- В 2–4 раза быстрее MT19937.
- Период может варьироваться (2^19937 − 1, 2^4253 − 1 и др.).
TinyMT
- Компактная версия с малым состоянием (127 бит) и периодом 2^127 − 1.
- Предназначена для встраиваемых систем и мобильных устройств.
Применение
Научные расчёты
- Моделирование методом Монте-Карло (физика, химия, финансы).
- Генетические алгоритмы и оптимизация.
- Статистические тесты (например, перестановочные тесты).
Компьютерная графика
- Генерация текстур, шумов (Perlin noise, симуляция облаков).
- Рендеринг (сглаживание, распределение лучей).
- Анимация частиц и физических эффектов.
Игровая индустрия
- Генерация случайных событий (выпадение предметов, поведение ИИ).
- Процедурная генерация уровней и карт.
Криптография (ограниченно)
- Не является криптостойким: по состоянию можно восстановить все предыдущие и последующие числа (атака по восстановлению состояния). Не рекомендуется для шифрования, генерации ключей или токенов.
- Используется в некоторых криптосистемах как вспомогательный ГПСЧ (например, в OpenSSL до версии 1.1.1 — для генерации случайных чисел в тестах).
Достоинства и недостатки
Достоинства
- Огромный период (2^19937 − 1).
- Высокая скорость (в 2–5 раз быстрее LCG с аналогичным качеством).
- Хорошее статистическое качество (проходит большинство тестов Diehard, TestU01, NIST).
- Простая реализация и малый размер состояния.
Недостатки
- Не криптостойкий: при известном состоянии можно восстановить всю последовательность. Для криптографии следует использовать CSPRNG (например, ChaCha20, AES-CTR).
- Зависимость от начального значения: при одинаковом seed генерируется идентичная последовательность (что может быть как плюсом для воспроизводимости, так и минусом для безопасности).
- Память: состояние 2,5 КБ может быть избыточным для встраиваемых систем.
- Периодические корреляции: при выборке чисел с шагом, кратным 624, могут проявляться корреляции (хотя на практике это редко).
Критика и альтернативы
В 2010-х годах были выявлены некоторые недостатки Mersenne Twister:
- Большое состояние затрудняет использование в устройствах с ограниченной памятью.
- Неустойчивость к «застреванию»: при неправильной инициализации (например, seed = 0) может генерировать последовательность с нулевыми значениями.
- Уязвимость к атакам по времени: для криптографических приложений не подходит.
В ответ были разработаны альтернативы:
- PCG (Permuted Congruential Generator) — быстрее и компактнее (64 бита состояния), проходит тесты Dieharder.
- Xorshift (Джордж Марсалья) — очень быстрый, но с меньшим периодом (2^128 − 1).
- ChaCha20 — криптостойкий ГПСЧ, используемый в Linux /dev/urandom и OpenBSD.
Тем не менее, Mersenne Twister остаётся стандартом для не-криптографических приложений благодаря балансу скорости, качества и простоты.
Интересные факты
- Период MT19937 (2^19937 − 1) настолько велик, что для его исчерпания при скорости генерации 1 млрд чисел в секунду потребуется более 10^6000 лет.
- Алгоритм назван в честь французского математика Марена Мерсенна (1588–1648), изучавшего числа вида 2^n − 1.
- Mersenne Twister включён в стандартную библиотеку C++ (std::mt19937), Python (random.getrandbits), R (set.seed), MATLAB (rng) и многих других языков.
- В 2015 году Мацумото и Нисимура выпустили версию SFMT с поддержкой SIMD, которая в 4 раза быстрее оригинальной.
Источники
- Matsumoto, M., & Nishimura, T. (1998). «Mersenne Twister: A 623-dimensionally equidistributed uniform pseudo-random number generator». ACM Transactions on Modeling and Computer Simulation, 8(1), 3–30.
- Matsumoto, M., & Nishimura, T. (2000). «Dynamic Creation of Pseudorandom Number Generators». Monte Carlo and Quasi-Monte Carlo Methods 1998, 56–69.
- Saito, M., & Matsumoto, M. (2008). «SIMD-oriented Fast Mersenne Twister: a 128-bit pseudorandom number generator». Monte Carlo and Quasi-Monte Carlo Methods 2006, 607–622.
- L'Ecuyer, P. (2012). «Random Number Generation». Handbook of Computational Statistics, 35–71.
- Knuth, D. E. (1997). «The Art of Computer Programming, Volume 2: Seminumerical Algorithms» (3rd ed.). Addison-Wesley.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →