Предположим, вы хотите использовать средства C ++ <random>
в практической программе (для некоторого определения «практический» - ограничения здесь являются частью этого вопроса). У вас есть код примерно так:
int main(int argc, char **argv) {
int seed = get_user_provided_seed_value(argc, argv);
if (seed == 0) seed = std::random_device()();
ENGINE g(seed); // TODO: proper seeding?
go_on_and_use(g);
}
У меня вопрос, какой тип вы должны использовать ENGINE
?
Раньше я всегда говорил,
std::mt19937
потому что это было быстро печатать и узнавать имя. Но в наши дни кажется, что все говорят, что Mersenne Twister очень тяжелый и кеша и даже не проходит все статистические тесты, которые делают другие.Я хотел бы сказать,
std::default_random_engine
потому что это очевидный «дефолт». Но я не знаю, меняется ли он от платформы к платформе, и я не знаю, статистически ли это хорошо.Поскольку в наши дни все работают на 64-битной платформе, следует ли нам хотя бы использовать
std::mt19937_64
overstd::mt19937
?Я хотел бы сказать,
pcg64
илиxoroshiro128
потому что они кажутся уважаемыми и легкими, но они вообще не существуют<random>
.Я ничего не знаю
minstd_rand
,minstd_rand0
,ranlux24
,knuth_b
конечно , они должны быть хорошо для чего - то - и т.д.?
Очевидно, здесь есть некоторые конкурирующие ограничения.
Сила двигателя. (
<random>
не имеет криптографически сильных PRNG, но все же некоторые из стандартизированных «слабее» других, верно?)sizeof
двигатель.Скорость его
operator()
.Легкость высева.
mt19937
общеизвестно, что правильно посеять правильно, потому что у него так много состояний для инициализации.Переносимость между поставщиками библиотек. Если один поставщик
foo_engine
производит разные номера от другогоfoo_engine
, это не подходит для некоторых приложений. (Надеюсь, это не исключает ничего, кроме, может бытьdefault_random_engine
.)
Взвесив все эти ограничения как можно лучше, что бы вы назвали окончательным ответом «наилучшая практика - оставаться в пределах стандартной библиотеки»? Должен ли я просто продолжать использовать std::mt19937
, или как?