C++ 我应该如何为小于标准std::mersenne_twister_引擎选择参数?

C++ 我应该如何为小于标准std::mersenne_twister_引擎选择参数?,c++,c++11,random,stl,mersenne-twister,C++,C++11,Random,Stl,Mersenne Twister,我需要一个C++11随机数发生器,这是“足够好”,我可以保存和恢复状态。我希望保存的状态大大小于此代码生成的6.6kb左右 std::mt19937 rng (1); std::ofstream save ("save.txt"); save << rng; 标准:mt19937 rng(1); std::ofstreamsave(“save.txt”); 保存如果不需要很多数字,任何像样的64位大小的RNG都很好。从我的帽子顶非常好的发电机将XorShift64*,纸张,代码 另

我需要一个C++11随机数发生器,这是“足够好”,我可以保存和恢复状态。我希望保存的状态大大小于此代码生成的6.6kb左右

std::mt19937 rng (1);
std::ofstream save ("save.txt");
save << rng;
标准:mt19937 rng(1); std::ofstreamsave(“save.txt”);
保存如果不需要很多数字,任何像样的64位大小的RNG都很好。从我的帽子顶非常好的发电机将XorShift64*,纸张,代码

另一种选择是PCG,“quadradisch.Praktisch.Gut.”,论文和代码


它们在统计上都比MT好,唯一的缺点是周期小,但就我所见,您认为这没问题。

有许多状态小的好发电机:MRG32k3a、LFSR113、Chacha-8、Philox-32x4。即使是Mixmax(N=17)按您的标准也会很小(状态为17双)

TinyMT也是一种可能性,尽管Vigna已经证明有些位并不总是好的(不确定不是很好的低位在实践中是否真的很重要)


我会对基于xorshift的RNG保持警惕,例如松本的论文。我也怀疑PCG,如果只是在网站的FrontPage上的彩色表:它太笨了,不存在所有相关的生成器,当然也倾向于PCG。

在TinyMT写一个包装可能会更简单。如果你用不同的引擎,你可以考虑表。还请注意,代码以文本模式保存引擎的状态,而不是二进制。二进制大小只有~2.5kb。可能是T.C.,但我想真正了解问题所在。从数量级来看,2.5kb的sbabbi仍然太多。从统计上看,这并不一定比MT好。通过所有BigCrush并不能说明一切。松本或莱奎尔在不同时期都展示并解释了这一点。