stringtranslate.com

Мерсенн Твистер

Mersenne Twister — это генератор псевдослучайных чисел общего назначения (PRNG), разработанный в 1997 году Макото Мацумото (松本 眞) и Такудзи Нисимурой (西村 拓士) . [1] [2] Его название происходит от выбора простого числа Мерсенна в качестве длины периода.

Вихрь Мерсенна был специально разработан для исправления большинства недостатков, обнаруженных в старых ГПСЧ.

Наиболее часто используемая версия алгоритма Mersenne Twister основана на простом числе Мерсенна . Стандартная реализация этого, MT19937, использует 32-битную длину слова. Существует другая реализация (с пятью вариантами [3] ), которая использует 64-битную длину слова, MT19937-64; она генерирует другую последовательность.

к-распределение

Псевдослучайная последовательность w -битных целых чисел периода P называется k-распределенной с точностью v -бит, если выполняется следующее.

Пусть trunc v ( x ) обозначает число, образованное ведущими v битами x , и рассмотрим P из k v -битных векторов
.
Тогда каждая из возможных комбинаций битов встречается одинаковое количество раз за период, за исключением комбинации, состоящей из одних нулей, которая встречается на один раз реже.

Алгоритмическая детализация

Визуализация генерации псевдослучайных 32-битных целых чисел с использованием Mersenne Twister. Раздел «Извлечение числа» показывает пример, где целое число 0 уже было выведено, а индекс равен целому числу 1. «Генерация чисел» запускается, когда все целые числа были выведены.

Для слова длиной w бит алгоритм Mersenne Twister генерирует целые числа в диапазоне .

Алгоритм Mersenne Twister основан на матричной линейной рекуррентности над конечным двоичным полем . Алгоритм представляет собой скрученный обобщенный регистр сдвига с обратной связью [4] (скрученный GFSR или TGFSR) рациональной нормальной формы (TGFSR(R)), с отражением бита состояния и закалкой. Основная идея заключается в определении ряда через простое рекуррентное соотношение, а затем выводе чисел вида , где T — обратимая -матрица, называемая матрицей закалки .

Общий алгоритм характеризуется следующими величинами:

с ограничением, что является простым числом Мерсенна. Этот выбор упрощает тест примитивности и тест k -распределения , которые необходимы при поиске параметров.

Ряд определяется как ряд w -битных величин с рекуррентным соотношением:

где обозначает конкатенацию битовых векторов (со старшими битами слева), побитовое исключающее ИЛИ (XOR), означает старшие wr битов , а означает младшие r битов .

Все индексы могут быть смещены на -n

где теперь левая ось, , является следующим сгенерированным значением в ряду с точки зрения значений, сгенерированных в прошлом, которые находятся в правой оси.

Преобразование скручивания A определяется в рациональной нормальной форме как: с единичной матрицей. Рациональная нормальная форма имеет то преимущество, что умножение на A может быть эффективно выражено как: (помните, что здесь умножение матриц выполняется в , и поэтому побитовое XOR заменяет сложение) где — младший бит .

Как и TGFSR(R), Mersenne Twister каскадируется с темперирующим преобразованием для компенсации уменьшенной размерности равнораспределения (из-за выбора A в рациональной нормальной форме). Обратите внимание, что это эквивалентно использованию матрицы A , где для T — обратимая матрица, и, следовательно, анализ характеристического полинома, упомянутый ниже, по-прежнему остается в силе.

Как и в случае с A , мы выбираем преобразование закалки, которое легко вычисляется, и поэтому фактически не конструируем само T. Это закалка определяется в случае вихря Мерсенна как

где — следующее значение из ряда, — временное промежуточное значение, а — значение, возвращаемое алгоритмом, с и как побитовые сдвиги влево и вправо , и как побитовое И. Первое и последнее преобразования добавляются для улучшения равномерного распределения нижних бит. Из свойства TGFSR требуется достичь верхней границы равномерного распределения для верхних бит.

Коэффициенты для MT19937 следующие:

Обратите внимание, что 32-битные реализации Mersenne Twister обычно имеют d  = FFFFFFFF 16. В результате d иногда опускается в описании алгоритма, поскольку побитовое and с d в этом случае не имеет никакого эффекта.

Коэффициенты для MT19937-64 следующие: [5]

Инициализация

Состояние, необходимое для реализации Mersenne Twister, представляет собой массив из n значений по w бит каждое. Для инициализации массива используется начальное значение w бит для подачи через установку начального значения и последующую установку

для с по .

код С

#include <stdint.h> #define n 624 #define m 397 #define w 32 #define r 31 #define UMASK (0xffffffffUL << r) #define LMASK (0xffffffffUL >> (wr)) #define a 0x9908b0dfUL #define u 11 #define s 7 #define t 15 #define l 18 #define b 0x9d2c5680UL #define c 0xefc60000UL #define f 1812433253ULtypedef struct { uint32_t state_array [ n ]; // массив для вектора состояния int state_index ; // индекс в массиве векторов состояния, 0 <= state_index <= n-1 всегда } mt_state ;        void initialize_state ( mt_state * state , uint32_t seed ) { uint32_t * state_array = & ( state -> state_array [ 0 ]); state_array [ 0 ] = seed ; // предлагаемое начальное seed = 19650218UL for ( int i = 1 ; i < n ; i ++ ) { seed = f * ( seed ^ ( seed >> ( w -2 ))) + i ; // Knuth TAOCP Vol2. 3rd Ed. P.106 для множителя. 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 ; // указывает на текущее местоположение состояния // 0 <= state_index <= n-1 всегда // int k = k - n; // указывает на состояние за n итераций до // if (k < 0) k += n; // циклическая индексация по модулю n // предыдущие 2 строки на самом деле ничего не делают // только для иллюстрации int j = k - ( n -1 ); // указывает на состояние за n-1 итераций до if ( j < 0 ) j += n ; // циклическая индексация по модулю n                                 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 ); // указать на состояние за nm итераций до этого if ( j < 0 ) j += n ; // циклическая индексация по модулю n x = state_array [ j ] ^ xA ; // вычислить следующее значение в состоянии state_array [ k ++ ] = x ; // обновить новое значение состояния if ( k >= n ) k = 0 ; // циклическая индексация по модулю n state -> state_index = k ; uint32_t y = x ^ ( x >> u ); // закалка y = y ^ (( y << s ) & b ); y = y ^ (( y << t ) & c ); uint32_t z = y ^ ( y >> l ); return z ; }                                                                                                     

Сравнение с классическим GFSR

Для достижения теоретического верхнего предела периода в T GFSR , должен быть примитивным многочленом , являющимся характеристическим многочленом

Трансформация кручения улучшает классический GFSR, придавая ему следующие ключевые свойства:

Варианты

CryptMT — это потоковый шифр и криптографически безопасный генератор псевдослучайных чисел , который использует Mersenne Twister внутри себя. [6] [7] Он был разработан Мацумото и Нисимурой вместе с Марико Хагитой и Муцуо Сайто. Он был представлен в проект eSTREAM сети eCRYPT . [6] В отличие от Mersenne Twister или других его производных, CryptMT запатентован .

MTGP — это вариант Mersenne Twister, оптимизированный для графических процессоров , опубликованный Муцуо Сайто и Макото Мацумото. [8] Базовые линейные рекуррентные операции расширены из MT, а параметры выбраны так, чтобы позволить многим потокам вычислять рекурсию параллельно, при этом разделяя свое пространство состояний для снижения нагрузки на память. В статье утверждается улучшенное равнораспределение по сравнению с MT и производительность на старом (2008 года) GPU ( Nvidia GTX260 с 192 ядрами) 4,7 мс для 5×10 7 случайных 32-битных целых чисел.

SFMT ( SIMD -ориентированный Fast Mersenne Twister) — это вариант Mersenne Twister, представленный в 2006 году [9], разработанный для быстрой работы на 128-битной SIMD.

Intel SSE2 и PowerPC AltiVec поддерживаются SFMT. Он также используется для игр с Cell BE в PlayStation 3. [ 11]

TinyMT — это вариант Mersenne Twister, предложенный Сайто и Мацумото в 2011 году. [12] TinyMT использует всего 127 бит пространства состояний, что значительно меньше по сравнению с 2,5 КБ состояния оригинала. Однако его период составляет , что намного короче оригинала, поэтому авторы рекомендуют его только в случаях, когда память в дефиците.

Характеристики

Преимущества:

Недостатки:

Приложения

Mersenne Twister используется в качестве ГПСЧ по умолчанию в следующем программном обеспечении:

Он также доступен в Apache Commons , [47] в стандартной библиотеке C++ (начиная с C++11 ), [48] [49] и в Mathematica . [50] Дополнительные реализации предоставляются во многих библиотеках программ, включая Boost C++ Libraries , [51] CUDA Library , [52] и NAG Numerical Library . [53]

Mersenne Twister — один из двух PRNG в 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 году) — это еще один k -распределенный PRNG, который показывает вычислительную скорость, схожую с MT, и лучшие статистические свойства, поскольку удовлетворяет всем текущим (2019) критериям TestU01; при использовании с соответствующим выбором параметров ACORN может иметь произвольно большой период и точность.

Семейство PCG представляет собой более современный генератор с большим периодом, с лучшей локализацией кэша и менее обнаруживаемым смещением при использовании современных методов анализа. [60]

Ссылки

  1. ^ Мацумото, М.; Нисимура, Т. (1998). «Вихрь Мерсенна: 623-мерно равнораспределенный равномерный генератор псевдослучайных чисел». Труды ACM по моделированию и компьютерному моделированию . 8 (1): 3–30. CiteSeerX  10.1.1.215.1141 . doi :10.1145/272991.272995. S2CID  3332028.
  2. ^ Например, Марсланд С. (2011) Машинное обучение ( CRC Press ), §4.1.1. Также см. раздел «Внедрение в программные системы».
  3. ^ Джон Савард. "Вихрь Мерсенна". Последующая статья, опубликованная в 2000 году, дала пять дополнительных форм вихря Мерсенна с периодом 2^19937-1. Все пять были разработаны для реализации с 64-битной арифметикой вместо 32-битной.
  4. ^ Мацумото, М.; Курита, И. (1992). «Скрученные генераторы GFSR». Труды ACM по моделированию и компьютерному моделированию . 2 (3): 179–194. doi :10.1145/146382.146383. S2CID  15246234.
  5. ^ ab "std::mersenne_twister_engine". Генерация псевдослучайных чисел . Получено 2015-07-20 .
  6. ^ ab "CryptMt and Fubuki". eCRYPT . Архивировано из оригинала 2012-07-01 . Получено 2017-11-12 .
  7. ^ Мацумото, Макото; Нисимура, Такудзи; Хагита, Марико; Сайто, Муцуо (2005). «Криптографический поток Мерсенна и блочный шифр Фубуки» (PDF) .
  8. ^ Муцуо Сайто; Макото Мацумото (2010). «Варианты вихря Мерсенна, подходящие для графических процессоров». arXiv : 1005.4973v3 [cs.MS].
  9. ^ "SIMD-ориентированный быстрый вихрь Мерсенна (SFMT)". hiroshima-u.ac.jp . Получено 4 октября 2015 г. .
  10. ^ "SFMT:Сравнение скорости". hiroshima-u.ac.jp . Получено 4 октября 2015 г. .
  11. ^ "PlayStation3 License". scei.co.jp . Получено 4 октября 2015 г. .
  12. ^ "Tiny Mersenne Twister (TinyMT)". hiroshima-u.ac.jp . Получено 4 октября 2015 г. .
  13. ^ ab P. L'Ecuyer и R. Simard, "TestU01: "Библиотека AC для эмпирического тестирования генераторов случайных чисел", ACM Transactions on Mathematical Software , 33, 4, статья 22 (август 2007 г.).
  14. ^ Примечание: 2 19937 приблизительно равно 4,3 × 10 6001 ; это на много порядков больше предполагаемого числа частиц в наблюдаемой Вселенной , которое составляет 10 87 .
  15. Route, Matthew (10 августа 2017 г.). «Синтез популяции сверххолодных карликов в радиоизлучении». The Astrophysical Journal . 845 (1): 66. arXiv : 1707.02212 . Bibcode : 2017ApJ...845...66R. doi : 10.3847/1538-4357/aa7ede . S2CID  118895524.
  16. ^ "SIMD-ориентированный быстрый вихрь Мерсенна (SFMT): в два раза быстрее, чем вихрь Мерсенна". Японское общество содействия науке . Получено 27 марта 2017 г.
  17. ^ Макото Мацумото; Такудзи Нисимура. «Динамическое создание генераторов псевдослучайных чисел» (PDF) . Получено 19 июля 2015 г.
  18. ^ Хироши Харамото; Макото Мацумото; Такудзи Нисимура; Франсуа Паннетон; Пьер Л'Экюйер. "Эффективный прыжок вперед для F2-линейных генераторов случайных чисел" (PDF) . Получено 12 ноября 2015 г.
  19. ^ "mt19937ar: Mersenne Twister с улучшенной инициализацией". hiroshima-u.ac.jp . Получено 4 октября 2015 г. .
  20. ^ Фог, Агнер (1 мая 2015 г.). «Генератор псевдослучайных чисел для векторных процессоров и многоядерных процессоров». Журнал современных прикладных статистических методов . 14 (1): 308–334. doi : 10.22237/jmasm/1430454120 .
  21. ^ "Случайная ссылка". Справочное руководство по языку Dyalog . Получено 04.06.2020 .
  22. ^ "RANDOMU (Справочник IDL)". Центр документов Exelis VIS . Получено 23.08.2013 .
  23. ^ "Генератор случайных чисел". CRAN Task View: Распределения вероятностей . Получено 29.05.2012 .
  24. ^ "Документация класса "Random"". Документация Ruby 1.9.3 . Получено 29.05.2012 .
  25. ^ "random". бесплатная документация pascal . Получено 28.11.2013 .
  26. ^ "mt_rand — Генерация лучшего случайного значения". PHP Manual . Получено 2016-03-02 .
  27. ^ "Заметки о выпуске NumPy 1.17.0 — Руководство NumPy v1.21". numpy.org . Получено 29.06.2021 .
  28. ^ "9.6 random — Генерация псевдослучайных чисел". Документация Python v2.6.8 . Получено 29.05.2012 .
  29. ^ "8.6 random — Генерация псевдослучайных чисел". Документация Python v3.2 . Получено 29.05.2012 .
  30. ^ "random — Генерация псевдослучайных чисел — Документация Python 3.8.3". Документация Python 3.8.3 . Получено 2020-06-23 .
  31. ^ "Выбор дизайна и расширения". Руководство пользователя CMUCL . Получено 2014-02-03 .
  32. ^ "Случайные состояния". Руководство ECL . Получено 2015-09-20 .
  33. ^ "Генерация случайных чисел". Руководство пользователя SBCL .
  34. ^ "Случайные числа · Язык Джулии". docs.julialang.org . Получено 21.06.2022 .
  35. ^ «Случайные числа: Справочное руководство по GLib».
  36. ^ "Алгоритмы случайных чисел". GNU MP . Получено 21.11.2013 .
  37. ^ "16.3 Специальные вспомогательные матрицы". GNU Octave . Встроенная функция: rand
  38. ^ "Случайные числовые переменные среды". GNU Scientific Library . Получено 24.11.2013 .
  39. ^ Мелард, Г. (2014), «О точности статистических процедур в Microsoft Excel 2010», Computational Statistics , 29 (5): 1095–1128, CiteSeerX 10.1.1.455.5508 , doi :10.1007/s00180-014-0482-5, S2CID  54032450 .
  40. ^ «Справочник языка GAUSS 14» (PDF) .
  41. ^ "uniform". Справочник функций Gretl .
  42. ^ «Новый генератор случайных чисел — 64-битный вихрь Мерсенна».
  43. ^ «Распределения вероятностей — Справочное руководство Sage v7.2: Вероятность».
  44. ^ "grand - Случайные числа". Справка Scilab .
  45. ^ "генератор случайных чисел". Maple Online Help . Получено 21.11.2013 .
  46. ^ "Алгоритмы генератора случайных чисел". Центр документации, MathWorks .
  47. ^ "Генерация данных". Руководство пользователя Apache Commons Math .
  48. ^ "Генерация случайных чисел в C++11" (PDF) . Standard C++ Foundation .
  49. ^ "std::mersenne_twister_engine". Генерация псевдослучайных чисел . Получено 2012-09-25 .
  50. ^ [1] Документация Mathematica
  51. ^ "boost/random/mersenne_twister.hpp". Библиотеки Boost C++ . Получено 29-05-2012 .
  52. ^ "Обзор API хоста". Документация по инструментарию CUDA . Получено 2016-08-02 .
  53. ^ "G05 – Генераторы случайных чисел". Введение в главу библиотеки NAG . Получено 29.05.2012 .
  54. ^ "Генератор случайных чисел". IBM SPSS Statistics . Получено 21.11.2013 .
  55. ^ "Использование функций случайных чисел". Справочник языка SAS . Получено 21.11.2013 .
  56. ^ Справка по Stata: set rng -- Установить, какой генератор случайных чисел (ГСЧ) использовать
  57. ^ П. Л'Экуайе, «Генератор случайных чисел с равномерным распределением», Международная энциклопедия статистической науки , Ловрич, Миодраг (ред.), Springer-Verlag, 2010.
  58. ^ "Генератор xorshift*/xorshift+ и перестрелка с PRNG".
  59. ^ Харасе, С.; Кимото, Т. (2018). «Реализация 64-битных максимально равнораспределенных F2-линейных генераторов с простым периодом Мерсенна». Труды ACM по математическому программному обеспечению . 44 (3): 30:1–30:11. arXiv : 1505.06582 . doi : 10.1145/3159444. S2CID  14923086.
  60. ^ "The PCG Paper". 27 июля 2017 г.

Дальнейшее чтение

Внешние ссылки