Generator-Chisel.ru

Генератор чисел

Алгоритм работы генератора

Алгоритм работы генератор случайных чисел "Generator-Chisel.ru" основан на базе Вихря Мерсенна. Сам же, Вихрь Мерсенна основывается на свойствах простых чисел Мерсенна (отсюда название) и обеспечивает быструю генерацию высококачественных по критерию случайности псевдослучайных чисел.

Вихрь Мерсенна лишён многих недостатков, присущих другим ГПСЧ (генератор псевдослучайных чисел), таких как малый период, предсказуемость, легко выявляемые статистические закономерности. Вихрь Мерсенна является витковым регистром сдвига с обобщённой отдачей (TGFSR) (англ. twisted generalised feedback shift register). «Вихрь» — это преобразование, которое обеспечивает равномерное распределение генерируемых псевдослучайных чисел в 623 измерениях (для линейных конгруэнтных генераторов оно ограничено 5 измерениями). Поэтому функция корреляции между двумя последовательностями выборок в выходной последовательности вихря Мерсенна пренебрежимо мала. Псевдослучайная последовательность, порождаемая вихрем Мерсенна, имеет очень большой период, равный числу Мерсенна, что более чем достаточно для многих практических приложений. Существуют эффективные реализации Вихря Мерсенна, превосходящие по скорости многие стандартные ГПСЧ (в частности, в 2—3 раза быстрее линейных конгруэнтных генераторов). Алгоритм вихря Мерсенна реализован в программной библиотеке Boost, Glib и стандартных библиотеках для C++, Python, Ruby, R, PHP, MATLAB, Autoit. Выдаваемые вихрем Мерсенна последовательности псевдослучайных чисел успешно проходят статистические тесты DIEHARD, что подтверждает их хорошие статистические свойства.

Алгоритм работы Вихря Мерсенна алгоритмически реализуется двумя основными частями: рекурсивной и закалки. Рекурсивная часть представляет собой регистр сдвига с линейной обратной связью, в котором все биты в его слове определяются рекурсивно; поток выходных битов определяются также рекурсивно функцией битов состояния. Регистр сдвига состоит из 624 элементов, и, в общей сложности, из 19937 клеток. Каждый элемент имеет длину 32 бита за исключением первого элемента, который имеет только 1 бит за счет отбрасывания бита. Процесс генерации начинается с логического умножения на битовую маску, отбрасывающей 31 бита (кроме наиболее значащих). Следующим шагом выполняется инициализация (x0, x1,…, x623) любыми беззнаковыми 32-разрядными целыми числами. Следующие шаги включают в себя объединение и переходные состояния. Пространство состояний имеет 19937 бит (624·32 — 31). Следующее состояние генерируется сдвигом одного слова вертикально вверх и вставкой нового слова в конец. Новое слово вычисляется гаммированием средней части с исключённой[13]. Выходная последовательность начинается с x624, x625,…

Алгоритм производится в шесть этапов(шагов):

Шаг 0. Предварительно инициализируется значение констант u, h, a
u ← 10…0   битовая маска старших w-r бит,
h ← 01…1   битовая маска младших r бит,
a ← aw-1aw-2…a0  последняя строка матрицы A.

Шаг 1. x[0], x[1],…,x[n-1] ←  начальное заполнение

Шаг 2. Вычисление (xiu | xi+1l)

y ← (x[i] AND u1) OR (x[(i + 1) mod n] AND h1)

Шаг 3. Вычисляется значение следующего элемента последовательности по рекуррентному выражению (1)
x[i] ← x[(i + m) mod n] XOR (y>>1) XOR a   если младший бит y = 1

Или x[i] ← x[(i + m) mod n] XOR (y>>1) XOR 0   если младший бит y = 0

Шаг 4. Вычисление x[i]T
y ← x[i]
y ← y XOR (y>>u)
y ← y XOR ((y<<s) AND b)
y ← y XOR ((y<<t) AND c)
z ← y XOR (y>>l)
вывод z

Шаг 5. i ← (i + 1) mod n

Шаг 6. Перейти к шагу 2.