【问题标题】:How should I choose parameters for a smaller-than-standard std::mersenne_twister_engine?我应该如何为小于标准的 std::mersenne_twister_engine 选择参数?
【发布时间】:2015-06-19 08:17:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 只写一个围绕 TinyMT 的包装器可能更简单。
  • 如果您可以使用不同的引擎,请考虑 this 表。另请注意,您的代码以文本模式保存引擎的状态,而不是二进制。二进制大小仅为~2.5kb。
  • 也许,T.C.,但我想真正了解这些问题。而 sbabbi,2.5kb 仍然太多了,数量级。

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


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

【讨论】:

  • 那些在统计上不一定比 MT 好。通过所有 BigCrush 并不能说明一切。 Matsumoto 或 L'Ecuyer 已经多次展示并解释了这一点。
【解决方案2】:

有很多小状态的好生成器: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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多