假设您想<random>
在实际程序中使用C ++ 工具(对于“实际”的某些定义-这里的约束是该问题的一部分)。您的代码大致如下:
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,但是,某些标准化的PRNG比其他的“弱”,对吧?)sizeof
引擎。其速度
operator()
。易于播种。
mt19937
众所周知,很难正确地植入种子,因为它有太多的状态要初始化。库供应商之间的可移植性。如果一个供应商提供的
foo_engine
编号与另一供应商提供的编号不同foo_engine
,则对某些应用程序不利。(希望这不排除任何可能,除非default_random_engine
。)
尽可能权衡所有这些限制,您将说出最终的“最佳实践留在标准库中”的答案是什么?我应该继续使用std::mt19937
还是什么?