python - 来自单个种子的多个独立随机数流

标签 python numpy random random-seed

我有 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=2m_max=10000,分析将使用种子 20001、20002、20003 等)。这是不可取的,因为所有分析都将限于​​ m_max流之前会有碰撞,如果m_max太大,分析次数限制为2^32/m_max .
  • 使用种子创建随机数流,绘制624 32 位 integers每个流需要,和 set the state每个流的 624 个整数。 这似乎是完美的,只是我不知道 624 个随机整数是否实际上是 Mersenne Twister 的有效内部状态(它可以是任意位吗?)。我也不知道整数之间是否存在任何隐藏的相关性(也许它们是相同的流,只是移动了 624)。

  • 有没有标准的方法来做到这一点?

    最佳答案

    方法 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 parallelmultithreading RNGs 的详细信息。我还有关于在“Seed Generation for Noncryptographic PRNGs”中播种多个进程(不是 NumPy 特定的)的一般信息。

    关于python - 来自单个种子的多个独立随机数流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53122853/

    相关文章:

    python - pytorch 嵌入索引超出范围

    python - Python/Pandas 中的 bool 列比较

    python - 在 Python 中模拟不可变类的成员

    python - 从 Selenium 中的下拉菜单中进行选择 - 元素不可见 (Python)

    python - 如何在不更改 ubuntu 中的 linux 发行版的情况下升级 numpy

    python - 生成没有重复列的位向量数组

    python - NumPy 数组下三角区域中 n 个最大值的索引

    random - 在 Go 中生成范围内的随机数

    C++ mt19937 总是给出相同的数字,即使在播种时也是如此

    java - 点击android上的随机7位数字