我应该如何为小于标准的std :: mersenne_twister_engine选择参数?

时间:2015-04-13 21:11:48

标签: c++ c++11 random stl mersenne-twister

我需要一个“足够好”的C ++ 11随机数生成器,我可以保存并恢复状态。我希望保存的状态比6.6kb小得多所以这段代码产生了

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

std::mersenne_twister_engine有大量参数。这有点可怕。

就我的目的而言,大约数十亿的时期就足够了。我听说过TinyMT,这可能是合适的,但却看不出如何将其作为模板专业化来实现。

我应该如何选择参数?我怀疑如果我只是将“状态大小”参数减少到几个字就会破坏它。

我会考虑完全使用不同的引擎,但除了容忍适度的时期外,我不想牺牲统计随机性的质量。下面的人工制品(对于线性同余)是不可接受的。

enter image description here

2 个答案:

答案 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。