设置random.seed()来重新创建模拟行为并选择种子的影响

时间:2019-12-10 09:03:47

标签: python random random-seed

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

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

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

为澄清起见,我使用随机生成器在不同的内核上分配初始任务,并将输出与“我的最佳(确定性)初始分布”进行比较。我想用自己选择的种子广泛传播各种分布。

2 个答案:

答案 0 :(得分:1)

您选择的种子无关紧要

如果正确生成了pseduo随机数生成器,则任何种子都应创建数字的随机分布。

来自Wikipedia

  

对于要在伪随机数生成器中使用的种子,它不需要是随机的。由于数字生成算法的性质,只要忽略原始种子,该算法生成的其余值将以伪随机方式遵循概率分布。

答案 1 :(得分:1)

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

  1. 有许多PRNG,其给定的播种策略将产生相关的随机数序列。例如,在PCG中,从种子生成的两个序列仅在高位will be highly correlated上有所不同(“来自同一生成器的子序列”)。另一个例子,这次涉及Unity的RNG,可以在“ A Primer on Repeatable Random Numbers”中找到。
  2. 如果选择顺序种子,或者选择的种子差别很小,则如何使用种子初始化PRNG的状态可能很重要。我不知道基本的Python random.seed(integer_seed)会如何避免此问题,但是如果两个Mersenne Twister状态仅相差一个位,则它们产生的两个序列将相互关联,并且将花费{{3}消除这种相关性。其他PRNG也会发生类似的问题。
  3. 与其他常用的PRNG(通常为32到128位)相比,Merenne Twister具有巨大的状态(将近20,000位)。除非您为PRNG注入与状态一样大的种子,否则将不会生成某些PRNG状态(因此将不会生成某些随机数序列)。

要降低关联随机数的风险,您可以:

  1. 选择彼此不相关的种子。
  2. 使用两种或多种不同的PRNG设计(例如,除了Mersenne Twister(这是Python所使用的基础)之外,您还可以使用PCG,SFC或其他PRNG设计)。
  3. 使用PRNG算法(例如SFC)来支持独立的随机数字“流”。但是请注意,millions of numbers仍可能是高度相关的,因此应避免使用它们。

我将在“ what PCG calls "streams"”中对此进行详细说明。另请参见Seed Generation for Noncryptographic PRNGs

此外,如果您使用的是NumPy(这是一个流行的用于科学工作的Python库),请注意,NumPy 1.17引入了this question;它使用诸如PCG之类的 bit生成器和诸如新numpy.random.Generator之类的 random生成器。这是new random number generation system的结果。 NumPy文档包含有关proposal to change the RNG policy的详细信息。