假设我想在给定成功概率的情况下生成一堆二进制数生成器。我担心的一个问题是随机种子。 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
时,f2
和 f1
中设置的种子已被取代,这些种子不是 独立于全局随机对象。为每个 f()
调用再次导入 random
不会给你一个新的状态,因为实际上每次加载模块对象本身时都会重新绑定(bind)名称(仅在第一次导入)。
如果您希望每个函数都有一个种子随机生成器,则需要创建单独的 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 ofRandom
to get generators that don’t share state.
关于python - 随机种子如何在 Python 的函数工厂中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42799514/