random.setstate()和random.seed()之间的差异或相似之处的确切性质是什么?

时间:2017-08-28 15:55:04

标签: python random

我对种子的使用有一个理解(在很高的层次上)来生成随机数。因此,在生成随机数之前设置特定种子将导致在每次调用时生成相同的数字。

我假设通过

恢复状态
import random
test123 = random.getstate()
random.setstate(test123)

也会导致某些类似过程对随机数进行复制

我正在寻找他们的相同点和不同点的理解。例如:将种子设置为某个值并通过random.setstate(random.getstate())恢复生成器的内部状态在每种情况下使用某些方法来复制随机数?

关于他们的记录并不多,我能找到

1 个答案:

答案 0 :(得分:2)

种子是一个简单的初始值,您可以从中传递初始化生成器。另一方面,状态是发电机的全电流内部状态。是的,设置种子和设置状态基本上是相同的,因为它允许您重放特定的伪随机数序列。但是,在内部,生成器不能像种子一样使用简单的值。 get / setstate方法允许您执行的操作是以编程方式从正在运行的生成器恢复状态;而种子值则是您从配置文件中提供的参数,例如。

让我们来谈谈用例:你有一些涉及随机值的算法,你想测试那个算法。为了使其可测试,它必须是可重复的。这意味着您需要能够控制算法中的随机元素。这就是PRNG进入的地方,它们是可预测和可重复的(与真正的RNG不同)。您可以编写一些测试用例,指定一个简单的种子来将PRNG设置为特定状态。种子是可读的简短值,您可以轻松写入测试用例。

现在,如果您想在某个时刻中断测试用例以检查它,然后退后一步并重新运行一个特定步骤(无论是手动还是编程),您将需要获得PRNG的特定状态,以便以后能够将其重置为该特定状态。现在,PRNG上没有getseed方法,因为它不会在内部使用像你第一次提供的种子那样的值;但它有一个getstate方法,它有同样的目的,它的返回值更复杂。