【问题标题】:Is it worth changing the seed periodically when using python random number generation?使用 python 随机数生成时是否值得定期更改种子?
【发布时间】:2021-04-17 19:31:42
【问题描述】:

假设我使用 random.randrange 生成 10,000 个随机数,与对所有 10,000 个随机数使用相同的种子相比,在生成循环的部分过程中更改种子是否会对生成的值的分布产生任何有意义的差异?

import random 

epoch = int(0)

while True:
    if epoch%100 == 0: #every 100 epochs, generate a new seed
        random.seed()  
    random.randrange(1,1000,1)
    epoch += 1

我最初的想法是它不会,因为即使我们知道 python random 是确定性的,random.randrange(1,1000,1) 的每次连续运行仍然具有相同的权重,成为每个时期的 1000 个可能值中的任何一个。想法?

【问题讨论】:

  • 不会。种子只是确定 PRG(伪随机数生成器)的状态。它与分布无关。它使您的随机数(或者更好地说是伪随机数)可重现。

标签: python random random-seed


【解决方案1】:

调用random.seed 而不为a 传递任何值,就像你正在做的那样,可能会导致它每次都为fetch state from os.urandom()。这可能很浪费,因为它每次都请求完整的 19968 位,即624 uint32_ts。因此,如果您每次重新播种时只生成 100 个随机变量,secrets.randbelow(999)+1 可能会更好。

鉴于 MT19937 的输出可以在 624 variates 之后预测,那么与 Mark 所说的相反,这确实应该使其更难以预测。当然,假设您的操作系统正在为os.urandom 提供合理的 CSRNG,那么最新版本的 Linux、OSX、Windows 和大多数 BSD 都可以。

请注意,MT19937 在这方面尤其糟糕,尤其是考虑到它拥有的状态量,并且有许多生成器做得更好。

【讨论】:

  • 有趣。假设在 624 个变量之后继续使用 MT19937 种子,尽管我们可以预测未来的结果,结果是否仍然是“随机”分布的?随机是指他们不会对任何一组数字表现出明显的偏差或偏好?
  • 个人抽奖是统一的,当您查看许多相关性(例如 10**12 次抽奖)时,它开始分崩离析。 cs.stackexchange.com/q/50059/113260 有一些信息,即有一些标准化测试从大量 RNG 抽签中查看许多不同的统计数据,它们往往比任何普通的蒙特卡罗代码要求更高。在这一点上,MT 的使用已经融入了 Python,太多的单元测试会失败,它改变了它是值得的
【解决方案2】:

伪随机数生成器的输出取决于它从当前状态到下一个状态的转换。一个好的生成器的状态位将比其种子中的位多得多,因此定期重新播种实际上会增加序列的可预测性。我知道在一个种子被不必要地限制为少量比特的系统中存在基于此的实际攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 2021-03-23
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多