【问题标题】:Mersenne Twister init_by_array() function clarificationMersenne Twister init_by_array() 函数说明
【发布时间】:2020-01-10 04:11:42
【问题描述】:

我尝试使用 32 位种子实现跨平台一致的随机数生成。 大多数帖子将我指向Mersenne Twister 或编写我自己的实现。

source code中有一个函数叫做void init_by_array()。

这个函数的唯一目的是扩展32位传递的种子吗?

来自ReadMe

init_by_array(init_key, key_length) 初始化状态向量 通过使用无符号 32 位整数的数组 init_key[] 长度key_kength。如果 key_length 小于 624, 然后每个 32 位整数数组给出不同的初始值 状态向量。如果您想要更大的种子空间,这很有用 大于 32 位字。

仅根据最后一句假设无法理解。

代码似乎只使用 init_genrand() 运行良好,并且似乎产生了一致的结果。

【问题讨论】:

  • 这个:pcg-random.org/posts/cpp-seeding-surprises.html可能与您的担忧有关。
  • @Bob__ 有趣的阅读。可预测性部分特别感兴趣。
  • @DevilBinder MT 的可预测性是众所周知的,甚至在原始 MT 论文中也有描述:它是设计的一部分。

标签: c function random mersenne-twister


【解决方案1】:

Mersenne Twister 有 19937 位状态空间,可用于迭代其产生的值序列。如果使用 32 位整数对其进行初始化,则将其限制为 219937 个可能的起点中的 232 个,并且存在大量样本轨迹你永远不会看到的。 init_by_array() 函数允许您为初始状态指定更多位,从而有可能实现 MT 能够生成的任何采样轨迹。

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 2015-03-01
    • 1970-01-01
    • 2014-04-17
    • 2017-11-23
    • 2017-04-05
    • 2013-10-13
    • 2014-05-20
    • 2010-12-19
    相关资源
    最近更新 更多