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

时间:2017-03-15 01:17:41

标签: python random seed

假设我想在给定成功概率的情况下生成一堆二进制数生成器。我所关心的一个问题是关于随机种子。 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)

1 个答案:

答案 0 :(得分:3)

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

如果您想为每个功能设置种子随机生成器,则需要创建单独的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

  

此模块提供的函数实际上是random.Random类的隐藏实例的绑定方法。您可以实例化自己的Random实例,以获取不共享状态的生成器。