如何确定伪随机数生成器的周期?


14

假设我正在使用线性同余伪随机数生成器(PRNG)。给定种子,乘积因子(a),移动因子(c)和模量因子(m),我如何确定PRNG的周期?是否通过实验/模式检测算法确定它,或者有直接公式计算其周期? x0

尽管我的问题专门针对线性同余法,但我愿意了解更多有关如何实际计算其他PRNG的周期的信息。



qnp(x)Fq[x]nq

2
Floyd的周期检测算法以及Brent的周期检测算法都是检测周期的有效方法。两者都将返回该周期的某个倍数L,一旦有了该倍数,就可以分解L并查看哪一个是周期最小的因数。
xdavidliu

Answers:


12

m

要查找给定种子的非全周期LCG PRNG的周期,您只需要计算PRNG的迭代次数,直到它再次生成种子值即可。

从引用的维基百科页面

期间长度

mc

  • cm
  • a1m
  • a1m

cma

从历史上看,错误的选择导致了LCG的无效实施。一个特别说明性的例子是RANDU,它在1970年代初期被广泛使用,由于使用了这种不良的LCG,导致许多结果目前受到质疑。

为什么要使用全周期发生器

如果您不约束自己使用全周期LCG PRNG,那您将承担巨大的风险

如果您不知道给定的LCG是全周期的,那么您可能会得到一个具有任意数量的相互不同的序列的生成器,其中某些序列可能令人尴尬地很小并且具有令人震惊的随机性,甚至可能比臭名昭著的RANDU生成器还差

您真的不想检查每个可能的种子值来确保它生成的序列对于您的应用程序来说足够长。

进一步阅读

要获得有关伪随机数生成器的出色入门,我强烈建议您阅读有关随机数的数字食谱一章。


没错,但是我并没有将自己限制在整个周期的LCG PRNG上。我想提前知道,给定一些a,c和m,该周期不可避免地会是什么。我知道它是m的上限,但我想知道我们是否可以做得更好,并获得确切的周期。
保罗

我不认为这完全是出于技术上的考虑:问题是“如何使用任意参数确定LCG的周期”,而答案是“不要使用任意LCG,请始终使用全周期LCG,假设你,在回答你的问题将是最大可能的时期,通过定义”。该答案中提出的使用全周期LCF的论点是完全令人信服的,但问题是,这根本不是问题要问的。
xdavidliu

抱歉@xdavidliu,但我看不到您的新评论如何帮助我改善答案。您引起了我的注意,我实际上并没有回答问题,我修改了答案以解决此问题,然后以我认为可能会让您微笑的方式让您知道(如果您是Futurama的粉丝)。我认为没有什么需要说的了。
Mark Booth

请注意,在堆栈交换中,注释不打算用于扩展讨论,因为使用Computational Science Chat进行讨论。评论有助于改善问题和答案,而且分散了注意力,因此我们尝试将其降至最低。评论应被视为短暂评论,任何不再积极有助于改善问题或答案的评论都可以随时删除以整理帖子。
Mark Booth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.