初始化 Random.Seed 一次以保留种子

Initialize Random.Seed once to keep seed

我有一个包含很多 random.choice、random.choice、random.randint、random.uniform 等函数的函数,我必须在前面加上 random.seed商场。 我使用 python 3.8.6,有没有办法只在函数中保持种子初始化,或者至少有一种方法来切换它而不是每次都这样做?

听起来您对 PRNGs work. They are generators (it's right there in the name!) which produce a sequence of values that are deterministic but are constructed in an attempt to be indistinguishable from true randomness based on statistical tests. In essence, they attempt to pass a Turing test/imitation game 随机性的理解有误。他们通过维护位的内部状态来做到这一点,每次调用生成器时都会通过确定性算法更新位。种子应该扮演的唯一角色是设置初始内部状态,以便单独运行创建可重现的序列。为单独的运行重复种子对于调试和玩弄技巧以减少 Monte Carlo 模拟中某些 类 估计量的可变性很有用。

所有 PRNG 最终都会循环。由于内部状态由有限数量的比特组成,并且状态更新机制是确定性的,因此整个序列将从任何状态复制发生的点开始重复。换句话说,输出序列实际上是一个值循环。种子值与伪随机数的质量无关,由状态转换算法决定。从概念上讲,您可以将种子视为 PRNG 循环的入口点。 (请注意,这并不意味着你有一个循环只是因为你观察到相同的输出,只有当产生输出的内部状态重复时才会发生循环。这就是为什么 1980 年代和 90 年代出现了状态 space 包含的位数多于输出 space,允许重复输出值,如 birthday problem 预测的那样,而无需从该点开始逐字重复序列。)

如果您通过多次重新播种来弄乱一个好的 PRNG,那么您将在设计一个通过基于统计的图灵测试的算法时付出的所有努力付之东流。由于种子 不会 决定结果的质量,因此您需要额外的成本(从种子产生新的状态),没有获得任何统计收益,并且很可能会损害能力通过统计测试。不要那样做!