Недавно я привык к современным языкам, которые включают в себя хороший генератор случайных чисел, который обычно является Mersenne Twister; теперь, когда я вернулся к C ++, я должен решить, что использовать.
Я искал реализации Mersenne Twister и заметил, что их так много: есть ли такая, которая более широко используется и распространена, или я должен выбрать одну, если они все одинаково хороши?
Ответы:
C ++ 11 включает генератор Mersenne Twister по умолчанию как часть его нового
<random>
интерфейса. Например, чтобы сгенерировать целые числа равномерно между [-10, 10], используя MT:Большая часть этого также доступна в любом компиляторе, предлагающем TR1, хотя имена немного отличаются;
std::tr1::mt19937
иstd::tr1::uniform_int<int>
.Я обычно предостерегаю людей от использования Mersenne Twister. Это нормальный алгоритм, но большая его популярность - это просто маркетинг. 624 измерения случайности - это больше, чем нужно большинству людей, и MT предъявляет относительно жесткие требования к состоянию, и когда он выполняет полную перезапись таблицы, он может разрушить кэш. Я лично неравнодушен к xorshift, которая дает отличные сроки и разумные распределения для всего, что нужно игре, с крошечными требованиями к памяти и процессору.
Я написал (в основном?) C ++ 11-совместимый генератор xorshift - xorshift.hpp , xorshift.cpp - и разместил его в открытом доступе. Вы можете подключить это к любой функции рандомизации C ++ 11, как указано выше:
источник
Еще одна ГСЧ, которую я использовал ранее для целей gamedev, это «маленькая» ГСБ Боба Дженкинса, описанная здесь .
(У него также есть криптографический RNG под названием ISAAC, но он больше и медленнее, и играм не нужен такой уровень силы.)
источник