Реализация на языке c#.
ulong x; if (mti >= NN) { // generate NN words at one time for (var i = 0; i < NN - MM; i++) { x = (mt[i] & UM) | (mt[i + 1] & LM); mt[i] = mt[i + MM] ^ (x >> 1) ^ MAG01[(int) (x & 0x1L)]; } for (var i = NN - MM; i < NN - 1; i++) { x = (mt[i] & UM) | (mt[i + 1] & LM); mt[i] = mt[i + (MM - NN)] ^ (x >> 1) ^ MAG01[(int) (x & 0x1L)]; } x = (mt[NN - 1] & UM) | (mt[0] & LM); mt[NN - 1] = mt[MM - 1] ^ (x >> 1) ^ MAG01[(int) (x & 0x1L)]; mti = 0; } x = mt[mti++]; x ^= (x >> 29) & 0x5555555555555555L; x ^= (x << 17) & 0x71d67fffeda60000L; x ^= (x << 37) & 0xfff7eee000000000L; x ^= x >> 43; return x;
Рис. 7. Визуализация результатов работы генератора Вихрь Мерсенна.
Сравнение генераторов.
Линейный конгруэнтный генератор.
Достоинства:
Простота реализации (2 строчки кода)
Быстрота работы
Малое потребление памяти
Недостатки:
Небольшой период (обычно до m)
Плохие статистические свойства: последовательности могут быть предсказуемыми
Малопригоден для криптографии и серьёзного моделирования
Применение:
Игры, простые симуляции, тестовые задачи
XORshift.
Достоинства:
Очень быстрая работа
Минимальное потребление памяти (1-3 числа состояния)
Простота встраивания в систему
Недостатки:
Среднее качество случайности (лучше LCG, хуже MT)
Некоторые версии уязвимы к плохим стартовым значениям
Не рекомендуется для крипто- и сложного научного использования
Применение:
Игровая индустрия, простые приложения, работа в ограниченных по памяти и скорости условиях
Вихрь Мерсенна.
Достоинства:
Очень длинный период (2^19937−1)
Хорошие статистические свойства: проходит почти все тесты случайности
Широко применим как стандарт "качества" ПГСЧ
Недостатки:
Более сложная реализация
Высокое потребление памяти (около 2.5 КБ)
Не годится для криптографии (можно восстановить состояние по 624 выходным числам)
Применение:
Моделирование, компьютерная графика, статистика, научные задачи
В таблице приведена длительность для алгоритмов в миллисекундах.
Название генератора |
0..n |
0 seed 0..n |
100 seed 0..n |
Линейный конгруэнтный генератор |
10 |
28 |
699 |
XORshift |
7 |
26 |
420 |
Вихрь Мерсенна |
11 |
1870 |
2673 |
Табл. 1. Длительность для алгоритмов в миллисекундах.
Линейный конгруэнтный генератор — самый простой и быстрый, но с наихудшим качеством случайности.
XoRshift — компромисс между скоростью, простотой и неплохой случайностью там, где не требуется строгое соответствие тестам.
Вихрь Мерсенна — золотой стандарт для науки и моделирования, с очень длинным периодом и отличной случайностью.
Вывод.
В выводе можно отметить, что генерация псевдослучайных чисел является ключевым аспектом в множестве компьютерных приложений, от моделирования до криптографии. В ходе анализа трех алгоритмов — линейного конгруэнтного генератора, вихря Мерсенна и XORshift — выяснено, что каждый из них имеет свои достоинства и недостатки.
Линейный конгруэнтный генератор прост в реализации, но ограничен в качестве случайности и периодичности, что делает его менее подходящим для серьезных задач. Вихрь Мерсенна продемонстрировал выдающиеся характеристики, включая длинный период и высокий уровень случайности, что делает его предпочтительным выбором для более сложных приложений. XORshift, в свою очередь, предлагает отличное сочетание скорости и простоты реализации, но может иметь как ограничения по периодичности, так и по качеству случайности.
Таким образом, выбор подходящего алгоритма зависит от конкретных требований задачи, и важно учитывать компромиссы между скоростью, качеством случайности и сложностью реализации.
