【问题标题】:Mersenne Twister vs Mersenne Twister 64 bitMersenne Twister 与 Mersenne Twister 64 位
【发布时间】: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,那么我只能假设它适用于它的所有分发类。

标签: c++ boost random


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-17
    • 2012-01-23
    • 2020-01-10
    • 2013-10-13
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多