Mersenne Twister 与 Mersenne Twister 64 位

Posted

技术标签:

【中文标题】Mersenne Twister 与 Mersenne Twister 64 位【英文标题】:Mersenne Twister vs Mersenne Twister 64 bit 【发布时间】:2014-02-22 02:18:34 【问题描述】:

Boost 同时提供 mt19937 和 mt19937_64 http://www.boost.org/doc/libs/1_55_0/doc/html/boost_random/reference.html#boost_random.reference.generators

困惑 - 我是否必须使用 64 位版本(根据上述页面的性能要差得多)才能在 64 位平台上获得好的随机数?还是没关系?

【问题讨论】:

您在 64 位平台上运行,但您需要 64 位 randoms 吗?如果不是(您将它们用于一些有限模数,这本身就是一个错误,因为您应该使用分发类来代替),那么就不需要带大锤来驱动图钉。 我将 mt19937 包装在分发类中。这是否意味着无关紧要? 仅仅因为您在 64 位平台上并不意味着您所做的一切都需要 64 位。这完全取决于您在这种情况下是否需要 64 位。如果您需要 64 位随机性,请继续使用 64 位版本。如果不这样做,请使用 32 位版本。忘记您的计算机是 32 位还是 64 位。 @SideshowBob 如果 mt19937 的结果为您正在使用的发行版提供了适当的随机数,则无需使用 64 位版本。同样,只有在需要 64 位随机数(0...9223372036854775807 中的数字)时才需要它。 鉴于 boost 推荐 docs 默认情况下推荐使用 mt19937,那么我只能假设它适用于它的所有分发类。 【参考方案1】:

这是一个非常古老的帖子,但这里有一种误解,我想澄清一下。 Mersenne Twister 在内部产生整数状态。它产生一系列随机整数值(可以评估整数中每个单个位的随机性)。通常你会将这个整数输出转换为浮点数——隐藏这个事实。

如果 boost 提供 _64 位版本,这仅意味着内部状态是 64 位整数,而不是 32 位标准整数。这是一个重要的区别,因为在 64 位版本中必须保证两倍多的位的随机性。这实际上很昂贵,而且速度要慢得多。如果您能从中受益,很大程度上取决于您的问题。这是可能的——由于随机数序列质量差而导致的问题通常被低估了很多。 Mersenne Twister 无论如何都不是一个出色的随机数生成器。

还有其他具有偶数 128、256 或 512 位内部整数的随机数生成器。我不知道更多,但这当然是可能的。

这里的重要说明是:这与您的硬件系统/操作系统是 32 位或 64 位(或其他任何东西)完全无关。

【讨论】:

以上是关于Mersenne Twister 与 Mersenne Twister 64 位的主要内容,如果未能解决你的问题,请参考以下文章

mersenne twister 线程对 cpp 是不是安全

CUDA 的 Mersenne Twister 用于任意数量的线程

C# Mersenne Twister 随机整数生成器实现 (SFMT) 蒙特卡罗模拟

伪随机数生成算法-梅森旋转(Mersenne Twister/MT)

为啥在梯度噪声发生器中从 Mersenne twister 切换到其他 PRNG 会产生不好的结果?

将随机整数转换为范围 [min,max] 而不进行分支