我正在用python进行调度模拟,这是完全确定的。所以,当我有相同的输入和参数时,我总是得到相同的输出。
现在,我想随机化模拟的初始开始状态,并比较两个(或多个)不同模拟参数的输出。为了比较“相同的随机初始起始状态”,我想将random.seed()
设置为初始值,该初始值对于不同调度程序的所有比较都应保持不变。此外,我想查看一个调度程序在不同初始状态下的行为,因此必须更改random.seed()
。我当然要对所有调度程序执行此操作。
现在我的问题是,种子对随机生成器的“随机性”有什么影响?例如,选择种子1还是100是否重要?并且因为我想为同一调度程序使用不同的种子并将其与其他调度程序进行比较,所以我可以简单地使用例如种子1到10还是我的种子必须“更随机”?
为澄清起见,我使用随机生成器在不同的内核上分配初始任务,并将输出与“我的最佳(确定性)初始分布”进行比较。我想用自己选择的种子广泛传播各种分布。
答案 0 :(得分:1)
您选择的种子无关紧要
如果正确生成了pseduo随机数生成器,则任何种子都应创建数字的随机分布。
来自Wikipedia:
对于要在伪随机数生成器中使用的种子,它不需要是随机的。由于数字生成算法的性质,只要忽略原始种子,该算法生成的其余值将以伪随机方式遵循概率分布。
答案 1 :(得分:1)
尽管您选择的种子在理论上并不重要,但在实践中可能很重要。
random.seed(integer_seed)
会如何避免此问题,但是如果两个Mersenne Twister状态仅相差一个位,则它们产生的两个序列将相互关联,并且将花费{{3}消除这种相关性。其他PRNG也会发生类似的问题。要降低关联随机数的风险,您可以:
我将在“ 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的详细信息。