5

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

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

std::mersenne_twister_engine有大量参数。这有点吓人。

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

我应该如何选择参数?我怀疑如果我只是将“状态大小”参数减少到几个词,它会严重崩溃。

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

在此处输入图像描述

4

2 回答 2

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 好,唯一的缺点是小(呃)周期,但据我所知,你没问题

于 2015-04-14T01:39:07.387 回答
0

有很多小状态的好生成器:MRG32k3a、LFSR113、Chacha-8、Philox-32x4。即使是 Mixmax(N=17)按照您的标准(17 双打的状态)也会很小。

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

我会对基于 xorshift 的 rngs 保持警惕,请参阅论文再次,随机数主要落在平面上:例如 Matsumoto 的 xorshift128+ 生成器。我也对 PCG 持怀疑态度,哪怕只是网站首页上的彩色表格:它使事情变得过于愚蠢,没有提供所有相关的生成器,当然也偏向于 PCG。

于 2020-10-30T16:04:18.783 回答