伪随机数生成中是否存在“好/坏”种子之类的东西?

机器算法验证 随机生成
2022-03-28 14:41:53

好吧,我真的没有太多要添加到标题中的内容。我倾向于不在预随机数生成中使用种子,但是当包含模拟的初始研究项目扩展到包括同一模拟研究的更多方面时,它们很方便。

在这种情况下,如果使用种子,则只能执行附加任务。

那么有没有选择种子的“良好实践”技巧,或者可以随机选择它们?

1个回答

您可能想查看Matsumoto 等人的“伪随机数生成器初始化中的常见缺陷”

从某种意义上说,你使用什么种子并不重要,因为有了好的 PRNG,奇怪的结果应该很少见,就像自然界中的低概率结果应该很少见一样。您是否可以像某些人那样一直使用相同的种子,取决于应用程序。我个人永远不会这样做,但我运行蒙特卡尔模拟,其中不同的种子可能会产生不同的结果模式,我想知道这是否会发生。我最终关心的数据是当我使用相同的参数但不同的种子多次运行模拟时获得的数据集合。然后我可以对这些数据进行统计,绘制汇总数据等。

Mersenne Twister 和其他算法:

关于 jbowman 的评论,并不是每个人都像 O'Neill 一样对 Mersenne Twisters 持否定态度 (pcg-random.org/other-rngs.html)。如果您不关心 MT 的极长周期(可以说是矫枉过正),还有更好的算法(我认为,包括O'Neill 的 PCG 算法,尽管O'NeillVigna之间存在一些关于谁的算法更好的争论)。但是,MT在我信任的软件包中仍然很常见,其中 PRNG 质量很重要(相比之下,一些 Javarand()函数就没有那么好。)

Mersenne Twister 的任何体面实现都将使用另一个更简单的 PRNG 初始化其状态,这可能因不同的实现而异(参见Matsumoto 的这些评论)。在使用它的输出之前,Twister 应该被迭代至少 624 次(更好的是,两倍这个数字)。如果你这样做,你不应该对附近的种子有问题。(一个高质量的基于代理的建模库,MASON将 Mersenne Twister 与此方案一起使用,如果您告诉它使用相同的参数执行多次运行,默认情况下它只会为每个后续运行增加第一个种子。)

Mersenne Twisters 的另一个问题是,如果其内部 624x32 位状态有许多零位,则需要多次迭代才能摆脱这种模式。(参见Pannetton 等人的“基于线性递归模 2 的改进的长周期生成器”,它描述了一种更好的算法,WELL,尽管周期更短。)但是,如果您以通常的方式使用另一个伪随机数初始化 Mersenne Twister生成算法,我认为零问题不太可能是一个严重的问题,因为这样的算法很少会给 Mersenne Twister 提供具有大量零位的起始状态。(最新版本的 MT 零位问题较少;参见Saito 和 Matsumoto,“面向 SIMD 的快速 Mersenne Twister:,第 13-14 页。)

(注意关于 Mersenne Twisters 的额外细节:上面的评论是针对最常见的 Mersenne Twister 类型,内部状态为 624x32 位,周期为2199371. 如果直接播种,则需要提供 624 个 32 位数字作为种子。由于通常不希望这样做,因此默认情况下,您为包装函数提供 32 位(或可能为 64 位)种子,将其传递给更简单、质量较低的伪随机数生成器。这用于为 Mersenne Twister 生成 624x32 位种子。然而,MT 的工作方式是从其状态中获取连续的数字,将它们传递给重新排列数字中的位的函数,然后输出结果。当所有 624 个数字都以这种方式使用时,它会对整个内部状态执行操作(包括称为“扭曲”的步骤)以生成新的 624x32 位状态。这就是为什么您不应该使用前 624 或 1248 输出;它们部分是低质量伪随机数生成器的结果,Kneusel 关于 PRNG 的介绍性书籍包括对 Mersenne Twisters 的介绍,但请先阅读 xorshift 部分。)

(其他介绍性文本——不像 Kneusel 那样简单,而且它们不一定涵盖 Mersenne Twisters,如果你感兴趣的话——包括: