假设我正在使用线性同余伪随机数生成器 (PRNG)。给定一颗种子,乘法因子(a),移位因子(c)和模因子(m),我如何确定我的PRNG的周期?我是通过实验/模式检测算法来确定它,还是有一个直接的公式来计算它的周期?
虽然我的问题是关于线性同余方法的,但我愿意更多地了解在实践中如何为其他 PRNG 计算周期。
假设我正在使用线性同余伪随机数生成器 (PRNG)。给定一颗种子,乘法因子(a),移位因子(c)和模因子(m),我如何确定我的PRNG的周期?我是通过实验/模式检测算法来确定它,还是有一个直接的公式来计算它的周期?
虽然我的问题是关于线性同余方法的,但我愿意更多地了解在实践中如何为其他 PRNG 计算周期。
如果您将自己限制在全周期 LCG PRNG中,那么答案很简单,根据定义,它很简单.
要找到给定种子的非完整周期 LCG PRNG 的周期,您只需计算 PRNG 的迭代次数,直到它再次生成种子值。
从参考的维基百科页面:
周期长度
一般LCG的周期最多为,而对于一些比这少得多的选择。前提是为非零,当且仅当:
虽然 LCG 能够产生不错的伪随机数,但这对参数的选择极为敏感。,, 和.
从历史上看,糟糕的选择导致了 LCG 的无效实施。一个特别说明性的例子是RANDU,它在 1970 年代初期被广泛使用,并导致许多结果,由于使用这种较差的 LCG,目前这些结果受到质疑。
如果您不限制自己使用全周期 LCG PRNG,那么您将承担巨大的风险。
如果您不知道给定的 LCG 是全周期的,那么您最终可能会得到一个具有任意数量的相互不同序列的生成器,其中一些可能非常小并且具有令人震惊的随机性,甚至可能比臭名昭著的RANDU生成器更糟糕.
您真的不想检查每个可能的种子值以确保它生成的序列对于您的应用程序来说足够长。
对于伪随机数生成器的优秀入门,我强烈建议您阅读关于随机数的数字食谱一章。