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

редактировать

Вихрь Мерсенна является псевдослучайных чисел (ПСЧ). Это, безусловно, наиболее широко используемый ГПСЧ общего назначения. Его название происходит от того факта, что длина периода выбрана как простое число Мерсенна.

Mersenne Twister был разработан в 1997 году Макото Мацумото  [ джа ] (松本 眞) и Такудзи Нисимура (西村 拓 士). Он был разработан специально для исправления большинства недостатков, обнаруженных в старых ГПСЧ.

Наиболее часто используемая версия алгоритма Мерсенна Твистера основана на простом числе Мерсенна 2 19937 -1. Стандартная реализация этого, MT19937, использует 32-битную длину слова. Существует еще одна реализация (с пятью вариантами), в которой используется длина слова 64 бита, MT19937-64; он генерирует другую последовательность.

СОДЕРЖАНИЕ
  • 1 Приложение
    • 1.1 Программное обеспечение
  • 2 преимущества
  • 3 Недостатки
  • 4 альтернативы
  • 5 k -распределение
  • 6 Алгоритмическая деталь
    • 6.1 Инициализация
    • 6.2 Сравнение с классической GFSR
    • 6.3 Псевдокод
  • 7 вариантов
    • 7.1 CryptMT
    • 7.2 MTGP
    • 7.3 SFMT
    • 7,4 TinyMT
  • 8 ссылки
  • 9 Дальнейшее чтение
  • 10 Внешние ссылки
заявка
Основная статья: Генератор псевдослучайных чисел

Программное обеспечение

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

Он также доступен в Apache Commons, в стандартном C ++ (начиная с C ++ 11 ) и в Mathematica. Надстройка на реализацию обеспечивается во многих программных библиотеках, в том числе Boost, C ++ библиотеки, в библиотеке CUDA, и численной библиотека NAG.

Mersenne Twister - один из двух PRNG в SPSS : второй генератор сохранен только для совместимости со старыми программами, а Mersenne Twister считается «более надежным». Mersenne Twister также является одним из ГПСЧ в SAS : другие генераторы устарели и устарели. Mersenne Twister - это ГПСЧ по умолчанию в Stata, другой - KISS, для совместимости со старыми версиями Stata.

Преимущества
  • Имеет разрешительную лицензию и не содержит патентов для всех вариантов, кроме CryptMT.
  • Проходит множество тестов на статистическую случайность, включая тесты Дихарда и большинство, но не все тесты TestU01.
  • Очень длинный период 2 19937  - 1. Обратите внимание, что, хотя длительный период не является гарантией качества в генераторе случайных чисел, короткие периоды, такие как 2 32, распространенные во многих старых программных пакетах, могут быть проблематичными.
  • k -распределенный с 32-битной точностью для каждого 1 ≤ k ≤ 623 (определение k -распределенного, см. ниже)
  • Реализации обычно создают случайные числа быстрее, чем истинные случайные методы. Исследование показало, что Mersenne Twister создает 64-битные случайные числа с плавающей запятой примерно в двадцать раз быстрее, чем аппаратно реализованный набор команд RDRAND на базе процессора.
Недостатки
  • Относительно большой буфер состояния, 2,5 КБ, если не используется вариант TinyMT (обсуждается ниже).
  • Посредственная пропускная способность по современным стандартам, если не используется вариант SFMT (обсуждается ниже).
  • Демонстрирует два явных отказа (линейная сложность) как в Crush, так и в BigCrush в наборе TestU01. Тест, как и Мерсенн Твистер, основан на F 2 -алгебре. Есть ряд других генераторов, которые проходят все тесты (и множество генераторов, которые терпят неудачу).
  • Несколько экземпляров, которые отличаются только начальным значением (но не другими параметрами), обычно не подходят для моделирования методом Монте-Карло, требующего независимых генераторов случайных чисел, хотя существует метод для выбора нескольких наборов значений параметров.
  • Плохая диффузия: может потребоваться много времени, чтобы начать генерировать выходные данные, которые проходят тесты на случайность, если начальное состояние сильно неслучайно, особенно если начальное состояние имеет много нулей. Следствием этого является то, что два экземпляра генератора, запущенные с почти одинаковыми начальными состояниями, обычно выводят почти одинаковую последовательность для многих итераций, прежде чем в конечном итоге расходятся. Обновление алгоритма MT в 2002 году улучшило инициализацию, так что начало с такого состояния маловероятно. Версия с графическим процессором (MTGP) считается даже лучше.
  • Содержит подпоследовательности, в которых нулей больше, чем единиц. Это усугубляет плохую диффузионную способность и затрудняет восстановление из состояний с множеством нулей.
  • Не является криптографически безопасным, если не используется вариант CryptMT (обсуждается ниже). Причина в том, что соблюдение достаточного количества итераций (624 в случае MT19937, поскольку это размер вектора состояния, из которого производятся будущие итерации) позволяет прогнозировать все будущие итерации.
Альтернативы

Альтернативный генератор, WELL («Well Equidistributed Long-period Linear»), предлагает более быстрое восстановление, равную случайность и почти равную скорость.

Генераторы xorshift и их варианты Marsaglia являются самыми быстрыми в классе LFSR.

64-битные MELG («64-битные максимально равнораспределенные F 2 -линейные генераторы с простым периодом Мерсенна») полностью оптимизированы с точки зрения свойств k -распределения.

Семейство ACORN (опубликовано в 1989 г.) - это еще один k- распределенный ГПСЧ, который показывает скорость вычислений, аналогичную MT, и лучшие статистические свойства, поскольку он удовлетворяет всем текущим (2019 г.) критериям TestU01; при использовании с соответствующим выбором параметров ACORN может иметь произвольно длительный период и точность.

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

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

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

Пусть trunc v ( x) обозначает число, образованное старшими v битами x, и рассмотрим P из k v -битовых векторов
( усечение v ( Икс я ) , усечение v ( Икс я + 1 ) , . . . , усечение v ( Икс я + k - 1 ) ) ( 0 я lt; п ) {\ displaystyle ({\ text {trunc}} _ {v} (x_ {i}), \, {\ text {trunc}} _ {v} (x_ {i + 1}), \,..., \, {\ text {trunc}} _ {v} (x_ {i + k-1})) \ quad (0 \ leq i lt;P)}.
Тогда каждая из 2 kv возможных комбинаций битов встречается одинаковое количество раз за период, за исключением комбинации всех нулей, которая встречается один раз реже.
Алгоритмическая деталь
Визуализация генерации псевдослучайных 32-битных целых чисел с помощью Mersenne Twister. В разделе «Извлечь число» показан пример, когда целое число 0 уже было выведено, а индекс - целое число 1. «Сгенерировать числа» запускается, когда все целые числа были выведены.

Для w- битного слова Twister Мерсенна генерирует целые числа в диапазоне [0, 2 w −1].

Алгоритм Мерсенна Твистера основан на матричной линейной рекуррентности над конечным двоичным полем F 2. Алгоритм представляет собой сдвиговый регистр со скрученной обобщенной обратной связью (скрученный GFSR или TGFSR) рациональной нормальной формы (TGFSR (R)) с отражением и темперированием битов состояния. Основная идея состоит в том, чтобы определить ряд x i через простое рекуррентное соотношение, а затем вывести числа в форме x i T, где T - обратимая F 2 -матрица, называемая матрицей темперирования.

Общий алгоритм характеризуется следующими величинами (некоторые из этих объяснений имеют смысл только после прочтения остальной части алгоритма):

  • w: размер слова (в битах)
  • n: степень рецидива
  • m: среднее слово, смещение, используемое в рекуррентном отношении, определяющем серию x, 1 ≤ m lt; n
  • r: точка разделения одного слова или количество бит нижней битовой маски, 0 ≤ r ≤ w - 1
  • a: коэффициенты матрицы скручивания рациональной нормальной формы
  • b, c: битовые маски темперирования TGFSR (R)
  • s, t: сдвиги долота отпуска TGFSR (R)
  • u, d, l: дополнительные смены / маски для закалки Mersenne Twister

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

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

Икс k + п знак равно Икс k + м ( ( Икс k ты Икс k + 1 л ) А ) k знак равно 0 , 1 , {\ displaystyle x_ {k + n}: = x_ {k + m} \ oplus \ left (({x_ {k}} ^ {u} \ mid {x_ {k + 1}} ^ {l}) A \ справа) \ qquad \ qquad k = 0,1, \ ldots}

где означает конкатенацию битовых векторов (с верхними битами слева), ⊕ побитовое исключающее ИЛИ (XOR), x k u означает верхние w - r битов x k, а x k +1 l означает младшие r битов х к +1. Преобразование скручивания A определяется в рациональной нормальной форме как: {\ displaystyle \ mid}

А знак равно ( 0 я ш - 1 а ш - 1 ( а ш - 2 , , а 0 ) ) {\ displaystyle A = {\ begin {pmatrix} 0 amp; I_ {w-1} \\ a_ {w-1} amp; (a_ {w-2}, \ ldots, a_ {0}) \ end {pmatrix}}}

с I w −1 в качестве  единичной матрицы ( w  - 1) × ( w - 1). Преимущество рациональной нормальной формы состоит в том, что умножение на A может быть эффективно выражено как: (помните, что здесь умножение матриц выполняется в F 2, и поэтому побитовое исключающее ИЛИ заменяет сложение)

Икс А знак равно { Икс 1 Икс 0 знак равно 0 ( Икс 1 ) а Икс 0 знак равно 1 {\ displaystyle {\ boldsymbol {x}} A = {\ begin {cases} {\ boldsymbol {x}} \ gg 1 amp; x_ {0} = 0 \\ ({\ boldsymbol {x}} \ gg 1) \ oplus { \ boldsymbol {a}} amp; x_ {0} = 1 \ end {case}}}

где x 0 - бит младшего разряда x.

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

Как и в случае с A, мы выбираем преобразование темперирования, чтобы оно было легко вычислимым, и поэтому на самом деле не конструируем само T. В случае Mersenne Twister закалка определяется как

у  : = х  ⊕ (( х  ≫  u) amp;  d)
y  : = y  ⊕ (( y  ≪  s) amp;  b)
y  : = y  ⊕ (( y  ≪  t) amp;  c)
z  : = y  ⊕ ( y  ≫  l)

где x - следующее значение из ряда, y - временное промежуточное значение, z - значение, возвращаемое алгоритмом, с ≪, ≫ как побитовые сдвиги влево и вправо, а amp; как побитовые и. Первое и последнее преобразования добавляются для улучшения равнораспределения младших битов. Из свойства TGFSR, s + t ≥ w / 2⌋ - 1 требуется для достижения верхней границы равнораспределения для верхних битов.

Коэффициенты для MT19937:

  • ( ш, п, м, г) = (32, 624, 397, 31)
  • а  = 9908B0DF 16
  • ( u, d) = (11; FFFFFFFF 16)
  • ( s, b) = (7, 9D2C5680 16)
  • ( t, c) = (15, EFC60000 16)
  • l  = 18

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

Коэффициенты для MT19937-64:

  • ( ш, п, м, г) = (64, 312, 156, 31)
  • а  = B5026F5AA96619E9 16
  • ( u, d) = (29, 5555555555555555 16)
  • ( s, b) = (17, 71D67FFFEDA60000 16)
  • ( t, c) = (37, FFF7EEE000000000 16)
  • l  = 43

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

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

x i = f × ( x i −1 ⊕ ( x i −1 gt;gt; ( w - 2))) + i

для i от 1 до n - 1. Первое значение, которое затем генерирует алгоритм, основано на x n, а не на x 0. Константа f формирует еще один параметр генератора, но не является частью самого алгоритма. Значение f для MT19937 составляет 1812433253, а для MT19937-64 - 6364136223846793005.

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

Для того, чтобы достичь 2 NW - г  - 1 теоретический верхний предел периода Т ДГФС, φ В ( т) должен быть примитивный многочлен, φ B ( т), являющийся характеристический полином из

B знак равно ( 0 я ш 0 0 я ш 0 0 я ш 0 0 0 0 я ш - р S 0 0 0 ) м -бросать {\ displaystyle B = {\ begin {pmatrix} 0 amp; I_ {w} amp; \ cdots amp; 0 amp; 0 \\\ vdots amp;amp;amp;amp; \\ I_ {w} amp; \ vdots amp; \ ddots amp; \ vdots amp; \ vdots \\\ vdots amp;amp;amp;amp; \\ 0 amp; 0 amp; \ cdots amp; I_ {w} amp; 0 \\ 0 amp; 0 amp; \ cdots amp; 0 amp; I_ {wr} \\ S amp; 0 amp; \ cdots amp; 0 amp; 0 \ end {pmatrix}} {\ begin {matrix} \\\\\ leftarrow m {\ hbox {-th row}} \\\\\\\\\ конец {матрица}}}

S знак равно ( 0 я р я ш - р 0 ) А {\ displaystyle S = {\ begin {pmatrix} 0 amp; I_ {r} \\ I_ {wr} amp; 0 \ end {pmatrix}} A}

Преобразование скручивания улучшает классический GFSR со следующими ключевыми свойствами:

  • Период достигает теоретического верхнего предела 2 nw - r  - 1 (кроме случая, когда он инициализирован с помощью 0)
  • Равное распределение в n измерениях (например, линейные конгруэнтные генераторы могут в лучшем случае управлять разумным распределением в пяти измерениях)

Псевдокод

Следующий псевдокод реализует общий алгоритм Мерсенна Твистера. Константы w, n, m, r, a, u, d, s, b, t, c, l и f такие же, как в описании алгоритма выше. Предполагается, что int представляет тип, достаточный для хранения значений с w битами:

 // Create a length n array to store the state of the generator int[0..n-1] MT int index := n+1 const int lower_mask = (1 lt;lt; r) - 1 // That is, the binary number of r 1's const int upper_mask = lowest w bits of ( not  lower_mask) // Initialize the generator from a seed function seed_mt(int seed) { index := n MT[0] := seed for i from 1 to (n - 1) { // loop over each element MT[i] := lowest w bits of (f * (MT[i-1] xor  (MT[i-1] gt;gt; (w-2))) + i) } } // Extract a tempered value based on MT[index] // calling twist() every n numbers function extract_number() { if index gt;= n { if index gt; n { error "Generator was never seeded" // Alternatively, seed with constant value; 5489 is used in reference C code } twist() } int y := MT[index] y := y xor  ((y gt;gt; u) and  d) y := y xor  ((y lt;lt; s) and  b) y := y xor  ((y lt;lt; t) and  c) y := y xor  (y gt;gt; l) index := index + 1 return lowest w bits of (y) } // Generate the next n values from the series x_i function twist() { for i from 0 to (n-1) { int x := (MT[i] and  upper_mask) + (MT[(i+1) mod  n] and  lower_mask) int xA := x gt;gt; 1 if (x mod  2) != 0 { // lowest bit of x is 1 xA := xA xor  a } MT[i] := MT[(i + m) mod  n] xor  xA } index := 0 }
Варианты

CryptMT

Основная статья: CryptMT

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

MTGP

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

SFMT

SFMT ( ориентированный на SIMD Fast Mersenne Twister) - это вариант Mersenne Twister, представленный в 2006 году, разработанный, чтобы быть быстрым при работе на 128-битном SIMD.

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

TinyMT

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

использованная литература
дальнейшее чтение
  • Харасе, С. (2014), «О -линейных отношениях генераторов псевдослучайных чисел Мерсенна Твистера», Математика и компьютеры в моделировании, 100: 103–113, arXiv : 1301.5435, doi : 10.1016 / j.matcom.2014.02.002, S2CID 6984431 F 2 {\ displaystyle \ mathbb {F} _ {2}}   .
  • Харасе, С. (2019), «Преобразование Mersenne Twister в числа с плавающей запятой двойной точности», Математика и компьютеры в моделировании, 161: 76–83, arXiv : 1708.06018, doi : 10.1016 / j.matcom.2018.08.006, S2CID   19777310.
внешние ссылки
Последняя правка сделана 2024-01-02 08:01:39
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте