我有 n
使用 m_i
进行类似分析伪随机数流( m_i
可能因分析而异)。每个分析都有自己的随机数种子,因此随机数在分析之间不相关。
我的问题是我需要创建 m_i
来自单个种子的流。该分析目前是用 Numpy 编写的,因此 Mersenne Twister 的解决方案是理想的,但我对其他成熟库中的解决方案持开放态度。我考虑了这些可能性:
m_i
整数,并将这些整数用作 m_i
的种子随机流。 这不好,因为birthday paradox .有2^32 (~40 亿)个种子,但如果我在 2^16(~60000)之后发生碰撞(两个流以相同的种子开始)。 m_max
对于每个流索引 1 以获取该流的种子。 (例如,对于 seed=2
和 m_max=10000
,分析将使用种子 20001、20002、20003 等)。这是不可取的,因为所有分析都将限于 m_max
流之前会有碰撞,如果m_max
太大,分析次数限制为2^32/m_max
. 有没有标准的方法来做到这一点?
最佳答案
方法 3 可以工作,因为任何 PRNG 的种子可以与该 PRNG 的状态一样长(例如,Mersenne Twister 的状态长度为 19968 位,或 624 * 32 位,因此可以接受多达这么多位的种子— 它不限于 32 或 64 位,许多实现 Mersenne Twister 的 API 的做法也是如此)。但是,您应该使用与 Mersenne Twister 设计无关的 PRNG,例如 PCG,为该 PRNG 设置种子,然后按照您的建议绘制 624 整数种子。 (或者,如果您不需要可重现的结果,或者如果您将保存以这种方式生成的 624 个整数种子,您可以使用加密 RNG,例如 os.urandom()
或 secrets.SystemRandom
来代替绘制这些种子。) My article on RNGs 建议使用几个 PRNG不同的设计。
更新(2019 年 12 月 1 日):
如果您使用 NumPy,请注意,与此同时,NumPy 1.17 引入了 new random number generation system ;它使用所谓的位生成器,例如 PCG 和随机生成器,例如新的 numpy.random.Generator
。这是 proposal to change the RNG policy 的结果。 NumPy 文档现在有关于 seeding RNGs in parallel 和 multithreading RNGs 的详细信息。我还有关于在“Seed Generation for Noncryptographic PRNGs”中播种多个进程(不是 NumPy 特定的)的一般信息。
关于python - 来自单个种子的多个独立随机数流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53122853/