python - 设置 random.seed() 以重新创建模拟行为和选择种子的影响

标签 python random random-seed

我正在用完全确定性的 python 进行调度模拟。所以,当我有相同的输入和参数时,我总是得到相同的输出。

现在我想随机化模拟的初始启动状态并比较两个(或更多)不同模拟参数的输出。为了比较“相同的随机初始起始状态”,我想为 random.seed() 设置一个初始值,对于不同调度程序的所有比较,该值应该保持不变。此外,我想查看一个调度程序在不同初始状态下的行为,因此我必须更改 random.seed()。当然,我必须为所有调度程序执行此操作。

现在我的问题是,种子对随机生成器的“随机性”有什么影响?例如,我选择 1 号种子还是 100 号种子有关系吗?而且因为我想为同一个调度程序使用不同的种子并将其与其他调度程序进行比较,我可以简单地使用例如种子 1 到 10 还是我的种子必须“更随机”?

为了澄清,我使用随机生成器在不同的核心上分配初始任务,并将输出与“我的最优(确定性)初始分配”进行比较。我想用我选择的种子获得广泛的不同分布。

最佳答案

尽管您选择的种子在理论上并不重要,但在实践中可能很重要。

  1. 有许多 PRNG,给定的播种策略将为其生成相关的伪随机数序列。例如,在大多数版本的 PCG 中,从种子生成的两个序列仅在高位上不同 will be highly correlated (“来自同一生成器的子序列”)。另一个例子,这次涉及 Unity 的 PRNG,可以在“A Primer on Repeatable Random Numbers”中找到。
  2. 如果您选择顺序种子,或仅略有不同的种子,则使用种子初始化 PRNG 状态的方式可能很重要。我不知道基础 Python 的 random.seed(integer_seed) 如何避免这个问题,但如果两个 Mersenne Twister 状态只有一位不同,它们产生的两个序列将相互关联,需要 millions of numbers来消除这种相关性。许多其他 PRNG 也会出现类似的问题,尤其是线性 PRNG。
  3. 与其他常用的 PRNG(通常为 32 到 128 位)相比,Mersenne Twister 具有巨大的状态(大约 20,000 位)。除非你用与其状态一样大的种子为 PRNG 播种,否则会有一些 PRNG 状态永远不会产生(因此一些伪随机数序列永远不会产生)。另见 this question ,其中讨论了播种 Mersenne Twister,这是基本 Python 中使用的算法。

为了降低相关伪随机数的风险,您可以使用 PRNG 算法,例如 SFC 和其他所谓的“基于计数器的”PRNG(Salmon 等人,“Parallel Random Numbers: As Easy as 1, 2, 3", 2011),支持伪随机数的独立“流”。 (但是请注意,PCG has a flawed notion of "streams"。)还有其他策略,我在“Seeding Multiple Processes”中对此进行了更多解释。另见 this question .

此外,如果您使用的是 NumPy(这是一个流行的用于科学工作的 Python 库),请注意 NumPy 1.17 引入了一个 new pseudorandom number generation system ;它使用所谓的位生成器,例如PCG,以及随机生成器,例如新的numpy.random.Generator。这是 proposal to change the PRNG policy 的结果. NumPy 文档包含有关 seeding PRNGs in parallel 的详细信息.

关于python - 设置 random.seed() 以重新创建模拟行为和选择种子的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59263562/

相关文章:

python - Scraper 不会停止点击下一页按钮

Python:将元组转换为逗号分隔的字符串

excel - 为什么我的随机数在 Excel 中没有相应变化?

r - 如何修复R中样本函数的随机种子

python - 生成没有上限的随机整数

c++ - 如何播种随机数生成器?

python - 如何在 Python 中列出 Google Cloud Bucket 文件夹中的所有对象?

php - 在不使用 shuffle() 函数的情况下在 PHP 中随机化数组顺序的最佳方法是什么?

c - 总是重复由 rand() 给出的数字

python - 如何在Python中的数据框中将特定位置的行插入?