Python 中的函数工厂中的随机种子是如何工作的?

How does a random seed work in a function factory in Python?

假设我想生成一组给定成功概率的二进制数生成器。我担心的一个问题是随机种子。 f1、f2、f3 的随机种子是它们的创建时间,对吧?而且无论全局命名空间中的随机种子如何,每个函数的种子都是固定的,对吧?

def f(p):
    import random, time
    random.seed(time.time())
    def g():
        return 1 if random.random() < p else 0
    return g

f1 = f(0.05)
f2 = f(0.65)
f3 = f(0.25)

您每次调用 f() 时都将种子传递给 全局随机对象 ,因为 random 模块提要中的所有顶级函数变成一个单例对象。这意味着在创建 f3 时,f2f1 中设置的种子已被取代,这些种子 not 独立于全局随机对象。为每个 f() 调用再次导入 random 不会给你一个新的状态,因为每次加载模块对象本身时(仅在第一次导入时)实际上只会重新绑定名称。

如果您想要每个函数有一个种子随机生成器,您需要创建单独的 random.Random() 个实例:

import random
import time

def f(p):
    seeded_random = random.Random(time.time())
    def g():
        return 1 if seeded_random.random() < p else 0
    return g

来自random module documentation

The functions supplied by this module are actually bound methods of a hidden instance of the random.Random class. You can instantiate your own instances of Random to get generators that don’t share state.