假设我想在给定成功概率的情况下生成一堆二进制数生成器。我所关心的一个问题是关于随机种子。 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)
答案 0 :(得分:3)
每次调用f()
时,都会将种子传递给全局随机对象,因为random
模块中的所有顶级函数都会输入单个对象。这意味着,在创建f3
时,f2
和f1
中设置的种子已被取代,种子不独立于全局随机对象。再次为每个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
实例,以获取不共享状态的生成器。