2015-04-13 6 views
6

Мне нужен генератор случайных чисел C++ 11, который является «достаточно хорошим», и который я могу сохранить и восстановить состояние. Я хочу, чтобы сохраненное состояние было значительно меньше, чем 6,6kb или около того, что этот код производитКак выбрать параметры для стандартного std :: mersenne_twister_engine?

std::mt19937 rng (1); 
std::ofstream save ("save.txt"); 
save << rng; 

std::mersenne_twister_engine имеет большое количество параметров. Это немного страшно.

Для моих целей достаточно периода порядка миллиардов. Я слышал о TinyMT, который может быть уместным, но не может понять, как реализовать его как специализированную специализацию.

Как выбрать параметры? Я подозреваю, что это сильно сломается, если я просто уменьшу параметр «размер штата» до нескольких слов.

Я хотел бы использовать другой двигатель целиком, но, кроме терпимого умеренного периода, я не хочу жертвовать качеством статистической случайности. Артефакты, такие как приведенные ниже (для линейных конгруэнтов), неприемлемы.

enter image description here

+0

Возможно, было бы проще написать обертку вокруг TinyMT. –

+1

Рассмотрите [this] (http://www.boost.org/doc/libs/1_57_0/doc/html/boost_random/reference.html#boost_random.reference.generators) таблицу, если вы в порядке с другим движком. Также обратите внимание, что ваш код сохраняет состояние движка в текстовом режиме, а не двоичном. Бинарный размер составляет всего ~ 2.5kb. – sbabbi

+0

Возможно, T.C., но я хочу на самом деле понять проблемы. И sbabbi, 2.5kb все еще слишком много, на порядок. – spraff

ответ

1

Если не нужно много цифр, любой приличный 64bit размер RNG будет хорошо. Из верхней части моей шляпы очень хороший генератор будет XorShift64 *, бумага http://arxiv.org/abs/1402.6246, код https://github.com/Iwan-Zotow/xorshift64STAR

Другим вариантом использования является ГКП «Quadratisch. Praktisch. Gut.», Бумага и код на http://www.pcg-random.org/

Они как статистически лучше, чем MT, единственным недостатком является небольшой (er) период, но с вами все в порядке, насколько я могу видеть