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
时,f2
和 f1
中设置的种子已被取代,这些种子 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.
假设我想生成一组给定成功概率的二进制数生成器。我担心的一个问题是随机种子。 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
中设置的种子已被取代,这些种子 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 ofRandom
to get generators that don’t share state.