Мерсенн Твистер
Mersenne Twister общего назначения — генератор псевдослучайных чисел (ГПСЧ), разработанный в 1997 году Макото Мацумото ( Макото Мацумото ) и Такудзи Нисимура ( Takuji Nishimura ) . [1] [2] Его название происходит от выбора простого числа Мерсенна в качестве длины периода.
Mersenne Twister был разработан специально для исправления большинства недостатков, обнаруженных в старых ГПСЧ.
Наиболее часто используемая версия алгоритма Твистера Мерсенна основана на простом числе Мерсенна. . Стандартная реализация этого, MT19937, использует длину слова 32 бита . Есть еще одна реализация (пять вариантов). [3] ), использующий 64-битную длину слова, MT19937-64; он генерирует другую последовательность.
k -распределение [ править ]
Псевдослучайная последовательность - битных W целых чисел периода P называется k-распределенным с точностью до v -бита, если выполняется следующее.
- Пусть trunc v ( x ) обозначает число, образованное старшими v битами x , и рассмотрим P k v . -битных векторов
- .
- Затем каждый из возможные комбинации битов встречаются одинаковое количество раз за период, за исключением комбинации всех нулей, которая встречается реже.
Алгоритмическая деталь [ править ]
Для длины слова w -бит Мерсенна Твистер генерирует целые числа в диапазоне .
Алгоритм Mersenne Twister основан на матричной линейной рекуррентности над конечным двоичным полем. . Алгоритм представляет собой регистр сдвига со скрученной обобщенной обратной связью. [4] (twisted GFSR, или TGFSR) рациональной нормальной формы (TGFSR(R)), с отражением и смягчением битов состояния. Основная идея состоит в том, чтобы определить ряд через простое рекуррентное соотношение, а затем выводить числа в виде , где T — обратимый -матрица называется матрицей закалки .
Общий алгоритм характеризуется следующими величинами:
- w : размер слова (в битах)
- n : степень рецидива
- m : среднее слово, смещение, используемое в рекуррентном отношении, определяющем серию. ,
- r : точка разделения одного слова или количество бит младшей битовой маски,
- a : коэффициенты матрицы скручивания рациональной нормальной формы
- b , c : Битовые маски смягчения TGFSR(R)
- s , t : Сдвиг битов отпуска TGFSR(R)
- u , d , l : дополнительные смены/маски закалочных долот Mersenne Twister
с тем ограничением, что является простым числом Мерсенна. Этот выбор упрощает тест на примитивность и тест на k -распределение , которые необходимы при поиске параметров.
Серия определяется как серия w -битных величин с рекуррентным соотношением:
где обозначает конкатенацию битовых векторов (со старшими битами слева), побитовое исключающее или (XOR), означает старшие w - r биты , и означает младшие r биты .
Все индексы могут быть смещены на -n.
где сейчас ЛХС, , — это следующее сгенерированное значение в серии с точки зрения значений, сгенерированных в прошлом, которые находятся в правой части.
Твист-преобразование A определяется в рациональной нормальной форме как:
Как и в случае с TGFSR(R), «Твистер Мерсенна» каскадируется с умеренным преобразованием , чтобы компенсировать пониженную размерность равнораспределения (из-за того, что A находится в рациональной нормальной форме). Обратите внимание, что это эквивалентно использованию матрицы A , где для T обратимая матрица, и поэтому приведенный ниже анализ характеристического полинома остается в силе.
Как и в случае с A , мы выбираем смягчающее преобразование так, чтобы оно было легко вычислимым, и поэтому фактически не конструируем T само по себе. В случае Mersenne Twister этот отпуск определяется как
где это следующее значение из ряда, является временным промежуточным значением, и значение, возвращаемое алгоритмом, с и при побитовом сдвиге влево и вправо , и побитовое И. как Первое и последнее преобразования добавлены для улучшения равнораспределения младших разрядов. Из собственности ТГФСР, требуется для достижения верхней границы равнораспределения старших битов.
Коэффициенты для MT19937:
Обратите внимание, что 32-битные реализации Mersenne Twister обычно имеют d = FFFFFFFF 16 . В результате d иногда опускается в описании алгоритма, поскольку побитовое и с d в этом случае не имеет никакого эффекта.
Коэффициенты для MT19937-64: [5]
Инициализация [ править ]
Состояние, необходимое для реализации Mersenne Twister, представляет собой массив из n значений по w бит каждое. Для инициализации массива w -битное начальное значение. используется через установив до начального значения и после этого установка
для от к .
- Первое значение, которое затем генерирует алгоритм, основано на , не на .
- Константа f образует еще один параметр генератора, но не является частью самого алгоритма.
- Значение f для MT19937 составляет 1812433253.
- Значение f для MT19937-64 составляет 6364136223846793005. [5]
Код C [ править ]
#include <stdint.h>
#define n 624
#define m 397
#define w 32
#define r 31
#define UMASK (0xffffffffUL << r)
#define LMASK (0xffffffffUL >> (w-r))
#define a 0x9908b0dfUL
#define u 11
#define s 7
#define t 15
#define l 18
#define b 0x9d2c5680UL
#define c 0xefc60000UL
#define f 1812433253UL
typedef struct
{
uint32_t state_array[n]; // the array for the state vector
int state_index; // index into state vector array
} mt_state;
void initialize_state(mt_state* state, uint32_t seed)
{
uint32_t* state_array = &(state->state_array[0]);
state_array[0] = seed; // suggested initial seed = 19650218UL
for (int i=1; i<n; i++)
{
seed = f * (seed ^ (seed >> (w-2))) + i; // Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier.
state_array[i] = seed;
}
state->state_index = 0;
}
uint32_t random_uint32(mt_state* state)
{
uint32_t* state_array = &(state->state_array[0]);
int k = state->state_index; // point to current state location
// int k = k - n; // point to state n iterations before
// if (k < 0) k += n; // modulo n circular indexing
// the previous 2 lines actually do nothing
// for illustrative purposes only
int j = k - (n-1); // point to state n-1 iterations before
if (j < 0) j += n; // modulo n circular indexing
uint32_t x = (state_array[k] & UMASK) | (state_array[j] & LMASK);
uint32_t xA = x >> 1;
if (x & 0x00000001UL) xA ^= a;
j = k - (n-m); // point to state n-m iterations before
if (j < 0) j += n; // modulo n circular indexing
x = state_array[j] ^ xA; // compute next value in the state
state_array[k++] = x; // update new state value
if (k >= n) k = 0; // modulo n circular indexing
state->state_index = k; // 0 <= state_index <= n-1 always
uint32_t y = x ^ (x >> u); // tempering
y = y ^ ((y << s) & b);
y = y ^ ((y << t) & c);
uint32_t z = y ^ (y >> l);
return z;
}
с классической Сравнение GFSR
Чтобы достичь теоретический верхний предел периода в Т GFSR , должен быть примитивным полиномом , являющийся полиномом характеристическим
Преобразование твиста улучшает классический GFSR следующими ключевыми свойствами:
- Период достигает теоретического верхнего предела (кроме случая, когда инициализировано значением 0)
- Равнораспределение в n измерениях (например, линейные конгруэнтные генераторы в лучшем случае могут обеспечить разумное распределение в пяти измерениях)
Варианты [ править ]
CryptMT — это поточный шифр и криптографически безопасный генератор псевдослучайных чисел , который внутри использует Mersenne Twister. [6] [7] Он был разработан Мацумото и Нисимурой вместе с Марико Хагитой и Муцуо Сайто. Он был представлен проекту eSTREAM сети eCRYPT . [6] В отличие от Mersenne Twister или других его производных, CryptMT запатентован .
MTGP — это вариант Mersenne Twister, оптимизированный для графических процессоров, опубликованный Муцуо Сайто и Макото Мацумото. [8] Базовые операции линейной рекурсии расширены из MT, а параметры выбраны так, чтобы позволить множеству потоков вычислять рекурсию параллельно, одновременно разделяя свое пространство состояний для уменьшения нагрузки на память. В документе утверждается улучшенное равномерное распределение по сравнению с MT и производительность на старом графическом процессоре (2008 года выпуска) ( Nvidia GTX260 со 192 ядрами) на уровне 4,7 мс для 5×10. 7 случайные 32-битные целые числа.
SFMT ( SIMD -ориентированный быстрый вихрь Мерсенна) представляет собой вариант вихря Мерсенна, представленный в 2006 году. [9] спроектирован так, чтобы быть быстрым при работе на 128-битном SIMD.
- Он примерно в два раза быстрее Mersenne Twister. [10]
- Он имеет лучшее свойство равнораспределения точности v-бит, чем MT, но хуже, чем WELL («Well Equidistributed Long- period Linear») .
- Он быстрее восстанавливается из начального состояния с нулевым превышением, чем MT, но медленнее, чем WELL.
- Он поддерживает различные периоды от 2 607 − 1 к 2 216091 − 1.
Intel SSE2 и PowerPC AltiVec поддерживаются SFMT. Он также используется для игр с Cell BE на PlayStation 3 . [11]
TinyMT — это вариант Mersenne Twister, предложенный Сайто и Мацумото в 2011 году. [12] TinyMT использует всего 127 бит пространства состояний, что значительно меньше по сравнению с исходными 2,5 КиБ состояния. Однако он имеет период , намного короче оригинала, поэтому авторы рекомендуют его только в тех случаях, когда память ограничена.
Характеристики [ править ]
Этот раздел содержит список плюсов и минусов . ( март 2024 г. ) |
Преимущества:
- Лицензионно-лицензированный и непатентованный для всех вариантов, кроме CryptMT.
- Проходит многочисленные тесты на статистическую случайность, включая тесты Дайхарда и большинство, но не все, тестов TestU01 . [13]
- Очень длительный период . Обратите внимание, что длительный период не является гарантией качества генератора случайных чисел, короткие периоды, такие как часто встречающийся во многих старых пакетах программного обеспечения, может быть проблематичным. [14]
- k – распределяется с точностью до 32 бит для каждого (определение k -распределенного см. ниже )
- Реализации обычно создают случайные числа быстрее, чем аппаратно реализованные методы. Исследование показало, что Mersenne Twister создает 64-битные случайные числа с плавающей запятой примерно в двадцать раз быстрее, чем аппаратно реализованный процессорный набор инструкций RDRAND . [15]
Недостатки:
- Относительно большой буфер состояний, почти 2,5 КБ , если не используется вариант TinyMT.
- Посредственная пропускная способность по современным стандартам, если не используется вариант SFMT (обсуждаемый ниже). [16]
- Демонстрирует две явные ошибки (линейная сложность) в Crush и BigCrush в пакете TestU01. Тест, как и Mersenne Twister, основан на -алгебра. [13]
- Множественные экземпляры, которые отличаются только начальным значением (но не другими параметрами), обычно не подходят для моделирования Монте-Карло , требующего независимых генераторов случайных чисел, хотя существует метод выбора нескольких наборов значений параметров. [17] [18]
- Плохая диффузия: может потребоваться много времени, чтобы начать генерировать выходные данные, которые проходят тесты на случайность , если начальное состояние сильно неслучайно, особенно если начальное состояние имеет много нулей. Следствием этого является то, что два экземпляра генератора, запущенные с почти одинаковыми начальными состояниями, обычно выдают почти одну и ту же последовательность в течение многих итераций, прежде чем в конечном итоге разойдутся. В обновлении алгоритма MT от 2002 года улучшена инициализация, поэтому начало с такого состояния маловероятно. [19] Говорят, что версия с графическим процессором (MTGP) еще лучше. [20]
- Содержит подпоследовательности, в которых нулей больше, чем единиц. Это добавляет к плохому свойству диффузии, что затрудняет восстановление из состояний со многими нулями.
- Не является криптографически безопасным , если не CryptMT используется вариант (обсуждаемый ниже). Причина в том, что соблюдение достаточного количества итераций (624 в случае MT19937, поскольку это размер вектора состояния, из которого производятся будущие итерации) позволяет предсказать все будущие итерации.
Приложения [ править ]
Mersenne Twister используется в качестве ГПСЧ по умолчанию в следующем программном обеспечении:
- Языки программирования: Dyalog APL , [21] ИДЛ , [22] Р , [23] Руби , [24] Свободный Паскаль , [25] PHP , [26] Python (также доступен в NumPy значение по умолчанию было изменено на PCG64 ). , однако в версии 1.17 [27] ), [28] [29] [30] CMU Common Lisp , [31] Встраиваемый Common Lisp , [32] Steel Bank Common Lisp , [33] Julia (до версии Julia 1.6 LTS, будет доступна позже, но начиная с версии 1.7 по умолчанию используется лучший/более быстрый ГСЧ) [34]
- Linux Библиотеки и программное обеспечение : GLib , [35] Библиотека арифметики множественной точности GNU , [36] ГНУ Октава , [37] Научная библиотека ГНУ [38]
- Другое: Microsoft Excel , [39] ГАУСС , [40] Гретель , [41] Был , [42] МудрецМатематика , [43] Скилаб , [44] Клен , [45] МАТЛАБ [46]
Он также доступен в Apache Commons , [47] в стандартной библиотеке C++ (начиная с C++11 ), [48] [49] и в Математике . [50] Дополнительные реализации предоставляются во многих программных библиотеках, включая библиотеки Boost C++ . [51] библиотека CUDA , [52] и Цифровая библиотека NAG . [53]
Mersenne Twister — один из двух ГПСЧ в SPSS : другой генератор сохранен только для совместимости со старыми программами, а Mersenne Twister считается «более надежным». [54] Mersenne Twister также является одним из PRNG в SAS : остальные генераторы устарели и устарели. [55] Mersenne Twister — это PRNG по умолчанию в Stata , другой — KISS , для совместимости со старыми версиями Stata. [56]
Альтернативы [ править ]
Альтернативный генератор WELL («Well Equidistributed Long- period Linear») предлагает более быстрое восстановление, равную случайность и почти равную скорость. [57]
Марсальи Генераторы и варианты xorshift являются самыми быстрыми в классе LFSR. [58]
64-битные MELG («64-битные максимально равнораспределенные -Линейные генераторы с простым периодом Мерсенна") полностью оптимизированы с точки зрения свойств k -распределения. [59]
Семейство ACORN (опубликовано в 1989 г.) — это еще один PRNG с k -распределением, который демонстрирует скорость вычислений, аналогичную MT, и лучшие статистические свойства, поскольку удовлетворяет всем текущим (2019 г.) критериям TestU01; при использовании с соответствующим выбором параметров ACORN может иметь сколь угодно большой период и точность.
Семейство PCG — это более современный генератор с большим периодом, с лучшей локальностью кэша и менее заметной предвзятостью с помощью современных методов анализа. [60]
Ссылки [ править ]
- ^ Мацумото, М.; Нисимура, Т. (1998). «Твистер Мерсенна: 623-мерный равнораспределенный равномерный генератор псевдослучайных чисел» . ACM-транзакции по моделированию и компьютерному моделированию . 8 (1): 3–30. CiteSeerX 10.1.1.215.1141 . дои : 10.1145/272991.272995 . S2CID 3332028 .
- ^ Например, Марсланд С. (2011) Машинное обучение ( CRC Press ), §4.1.1. Также смотрите раздел «Внедрение в программные системы».
- ^ Джон Савард. «Смерч Мерсенна» .
Последующая статья, опубликованная в 2000 году, представила пять дополнительных форм вихря Мерсенна с периодом 2^19937-1. Все пять были разработаны для реализации 64-битной арифметики вместо 32-битной.
- ^ Мацумото, М.; Курита, Ю. (1992). «Витые генераторы GFSR» . ACM-транзакции по моделированию и компьютерному моделированию . 2 (3): 179–194. дои : 10.1145/146382.146383 . S2CID 15246234 .
- ^ Jump up to: а б "std::mersenne_twister_engine" . Генерация псевдослучайных чисел . Проверено 20 июля 2015 г.
- ^ Jump up to: а б «CryptMt и Фубуки» . ЭКРИПТ . Архивировано из оригинала 1 июля 2012 г. Проверено 12 ноября 2017 г.
- ^ Мацумото, Макото; Нисимура, Такудзи; Хаггит, Марк; Сайто, Муцуо (2005). «Криптографический поток Мерсенна и блочный шифр Фубуки» (PDF) .
- ^ Муцуо Сайто; Макото Мацумото (2010). «Варианты Mersenne Twister, подходящие для графических процессоров». arXiv : 1005.4973v3 [ cs.MS ].
- ^ «SIMD-ориентированный быстрый вихрь Мерсенна (SFMT)» . Хиросима-u.ac.jp . Проверено 4 октября 2015 г.
- ^ «SFMT:Сравнение скорости» . Хиросима-u.ac.jp . Проверено 4 октября 2015 г.
- ^ «Лицензия PlayStation3» . scei.co.jp. Проверено 4 октября 2015 г.
- ^ «Крошечный Твистер Мерсенна (TinyMT)» . Хиросима-u.ac.jp . Проверено 4 октября 2015 г.
- ^ Jump up to: а б П. Л'Экуйер и Р. Симард, « TestU01: «Библиотека AC для эмпирического тестирования генераторов случайных чисел », Транзакции ACM в математическом программном обеспечении , 33, 4, статья 22 (август 2007 г.).
- ^ Примечание: 2 19937 составляет примерно 4,3 × 10 6001 ; это на много порядков больше предполагаемого числа частиц в наблюдаемой Вселенной , которое составляет 10 87 .
- ^ Рут, Мэтью (10 августа 2017 г.). «Синтез популяции ультрахолодных карликов с помощью радиовспышек» . Астрофизический журнал . 845 (1): 66. arXiv : 1707.02212 . Бибкод : 2017ApJ...845...66R . дои : 10.3847/1538-4357/aa7ede . S2CID 118895524 .
- ^ «SIMD-ориентированный Fast Mersenne Twister (SFMT): в два раза быстрее, чем Mersenne Twister» . Японское общество содействия науке . Проверено 27 марта 2017 г.
- ^ Макото Мацумото; Такудзи Нисимура. «Динамическое создание генераторов псевдослучайных чисел» (PDF) . Проверено 19 июля 2015 г.
- ^ Хироши Харамото; Макото Мацумото; Такудзи Нисимура; Франсуа Паннетон; Пьер Л'Экуайер. «Эффективный скачок вперед для F2-линейных генераторов случайных чисел» (PDF) . Проверено 12 ноября 2015 г.
- ^ "mt19937ar: Mersenne Twister с улучшенной инициализацией" . Хиросима-u.ac.jp . Проверено 4 октября 2015 г.
- ^ Туман, Агнер (1 мая 2015 г.). «Генератор псевдослучайных чисел для векторных и многоядерных процессоров» . Журнал современных прикладных статистических методов . 14 (1): 308–334. дои : 10.22237/jmasm/1430454120 .
- ^ «Случайная ссылка» . Справочное руководство по языку Dialog . Проверено 4 июня 2020 г.
- ^ «СЛУЧАЙНО (ссылка IDL)» . Центр документации Exelis VIS . Проверено 23 августа 2013 г.
- ^ «Генератор случайных чисел» . Представление задач CRAN: распределения вероятностей . Проверено 29 мая 2012 г.
- ^ « Документация класса «Случайный»» . Документация Ruby 1.9.3 . Проверено 29 мая 2012 г.
- ^ "случайный" . бесплатная документация по Паскалю . Проверено 28 ноября 2013 г.
- ^ «mt_rand — Генерирует лучшее случайное значение» . Руководство по PHP . Проверено 2 марта 2016 г.
- ^ «Примечания к выпуску NumPy 1.17.0 — Руководство по NumPy v1.21» . numpy.org . Проверено 29 июня 2021 г.
- ^ «9.6 случайный — Генерация псевдослучайных чисел» . Документация Python v2.6.8 . Проверено 29 мая 2012 г.
- ^ «8.6 случайный — Генерация псевдослучайных чисел» . Документация Python v3.2 . Проверено 29 мая 2012 г.
- ^ «random — Генерация псевдослучайных чисел — документация Python 3.8.3» . Документация Python 3.8.3 . Проверено 23 июня 2020 г.
- ^ «Выбор дизайна и расширения» . Руководство пользователя CMUCL . Проверено 3 февраля 2014 г.
- ^ «Случайные состояния» . Руководство по ECL . Проверено 20 сентября 2015 г.
- ^ «Генерация случайных чисел» . Руководство пользователя СБКЛ .
- ^ «Случайные числа · Язык Джулии» . docs.julialang.org . Проверено 21 июня 2022 г.
- ^ «Случайные числа: Справочное руководство GLib» .
- ^ «Алгоритмы случайных чисел» . ГНУ МП . Проверено 21 ноября 2013 г.
- ^ «16.3 Специальные матрицы полезности» . GNU Октава .
Встроенная функция: рандом
- ^ «Случайные числа переменных среды» . Научная библиотека ГНУ . Проверено 24 ноября 2013 г.
- ^ Мелар, Г. (2014), «О точности статистических процедур в Microsoft Excel 2010», Computational Статистика , 29 (5): 1095–1128, CiteSeerX 10.1.1.455.5508 , doi : 10.1007/s00180-014-0482- 5 , S2CID 54032450 .
- ^ «Справочник по языку GAUSS 14» (PDF) .
- ^ « Униформа ». Справочник по функциям Gretl .
- ^ «Новый генератор случайных чисел — 64-битный Mersenne Twister» .
- ^ «Распределение вероятностей — Справочное руководство Sage v7.2: Вероятность» .
- ^ "гранд - Случайные числа" . Справка по Scilab .
- ^ «генератор случайных чисел» . Онлайн-справка Maple . Проверено 21 ноября 2013 г.
- ^ «Алгоритмы генератора случайных чисел» . Центр документации MathWorks .
- ^ «Генерация данных» . Руководство пользователя Apache Commons Math .
- ^ «Генерация случайных чисел в C++11» (PDF) . Стандартная основа C++ .
- ^ "std::mersenne_twister_engine" . Генерация псевдослучайных чисел . Проверено 25 сентября 2012 г.
- ^ [1] Документация Mathematica
- ^ "boost/random/mersenne_twister.hpp" . Библиотеки Boost C++ . Проверено 29 мая 2012 г.
- ^ «Обзор API хоста» . Документация по набору инструментов CUDA . Проверено 2 августа 2016 г.
- ^ «G05 — Генераторы случайных чисел» . Введение в главу библиотеки NAG . Проверено 29 мая 2012 г.
- ^ «Генератор случайных чисел» . Статистика IBM SPSS . Проверено 21 ноября 2013 г.
- ^ «Использование функций случайных чисел» . Справочник по языку SAS . Проверено 21 ноября 2013 г.
- ^ Справка по Stata: set rng — укажите, какой генератор случайных чисел (ГСЧ) использовать.
- ^ П. Л'Экуйер, «Генератори равномерных случайных чисел», Международная энциклопедия статистических наук , Ловрик, Миодраг (ред.), Springer-Verlag, 2010.
- ^ «Генераторы xorshift*/xorshift+ и перестрелка PRNG» .
- ^ Харасе, С.; Кимото, Т. (2018). «Реализация 64-битных максимально равнораспределенных F 2 -линейных генераторов с простым периодом Мерсенна» . Транзакции ACM в математическом программном обеспечении . 44 (3): 30:1–30:11. arXiv : 1505.06582 . дои : 10.1145/3159444 . S2CID 14923086 .
- ^ «Бумага ПКГ» . 27 июля 2017 г.
Дальнейшее чтение [ править ]
- Харасе, С. (2014), «На -линейные отношения генераторов псевдослучайных чисел Мерсенна Твистера», Mathematics and Computers in Simulation , 100 : 103–113, arXiv : 1301.5435 , doi : 10.1016/j.matcom.2014.02.002 , S2CID 6984431 .
- Харасе, С. (2019), «Преобразование Мерсенна Твистера в числа с плавающей запятой двойной точности», Mathematics and Computers in Simulation , 161 : 76–83, arXiv : 1708.06018 , doi : 10.1016/j.matcom.2018.08.006 , S2CID 19777310 .
Внешние ссылки [ править ]
- Научная статья по MT и связанные с ней статьи Макото Мацумото.
- Домашняя страница Mersenne Twister с кодами на C, Fortran, Java, Lisp и некоторых других языках.
- Примеры Mersenne Twister — коллекция реализаций Mersenne Twister на нескольких языках программирования — на GitHub.
- SFMT в действии: Часть I — Создание DLL, включая поддержку SSE2 — в Code Project