初始化随机.播种一次以保持种子



我有一个函数,里面有很多random.choice、random.chooies、random.randint、random.uniform等函数,我必须把random.seed放在它们之前。我使用python 3.8.6,有没有办法只在函数中初始化种子,或者至少有一种方法来切换它,而不是每次都这样做?

听起来您对PRNG的工作方式有误解。它们是生成器(就在名称中!(,它产生一系列具有确定性的值,但其构建是为了与基于统计测试的真正随机性区分开来。本质上,他们试图通过图灵测试/模仿游戏的随机性。他们通过维护比特的内部状态来实现这一点,该状态通过确定性算法在每次调用生成器时进行更新。种子应该发挥的唯一作用是设置初始内部状态,以便单独运行创建可重复的序列。在蒙特卡洛模拟中,为单独的运行重复种子可能有助于调试和玩技巧来减少某些类估计器的可变性。

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

如果你通过多次重新播种来破坏一个好的PRNG,那么你就等于放弃了设计一个通过基于统计的图灵测试的算法所付出的所有努力。由于种子不能决定结果的质量,因此您调用了额外的成本(从种子中生成新状态(,没有获得统计效益,很可能会损害通过统计测试的能力。不要那样做!

最新更新