我需要一个“足够好”的C ++ 11随机数生成器,我可以保存并恢复状态。我希望保存的状态比6.6kb小得多所以这段代码产生了
std::mt19937 rng (1);
std::ofstream save ("save.txt");
save << rng;
std::mersenne_twister_engine有大量参数。这有点可怕。
就我的目的而言,大约数十亿的时期就足够了。我听说过TinyMT,这可能是合适的,但却看不出如何将其作为模板专业化来实现。
我应该如何选择参数?我怀疑如果我只是将“状态大小”参数减少到几个字就会破坏它。
我会考虑完全使用不同的引擎,但除了容忍适度的时期外,我不想牺牲统计随机性的质量。下面的人工制品(对于线性同余)是不可接受的。
答案 0 :(得分:1)
如果不需要很多数字,任何体面的64位大小的RNG都会很好。非常好的生成器是XorShift64 *,纸http://arxiv.org/abs/1402.6246,代码https://github.com/Iwan-Zotow/xorshift64STAR
使用的另一个选择是PCG,“Quadratisch.Praktisch。Gut。”,论文和代码http://www.pcg-random.org/
它们在统计上都比MT好,唯一的缺点是小(呃)时期,但就我所见,你可以接受
答案 1 :(得分:0)
有许多状态良好的良好生成器:MRG32k3a,LFSR113,Chacha-8,Philox-32x4。按照您的标准,即使Mixmax(N = 17)也很小(状态为17倍)。
TinyMT也有可能,尽管Vigna已证明某些位并不总是很好(不确定不太高的低位在实践中是否真的很重要)。
我会警惕基于xorshift的rng,例如,请参见Matsumoto的论文Again, random numbers fall mainly in the planes: xorshift128+ generators。我也对PCG表示怀疑,即使仅是网站首页上的彩色表格也是如此:它使事情变得愚蠢,没有提供所有相关的生成器,并且当然偏向PCG。