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

标签 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)

最佳答案

每次调用 f() 时,您都会将种子传递给全局随机对象,因为 random 中的所有顶级函数> 模块输入到单例对象中。这意味着在创建 f3 时,f2f1 中设置的种子已被取代,这些种子不是 独立于全局随机对象。为每个 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 of Random to get generators that don’t share state.

关于python - 随机种子如何在 Python 的函数工厂中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42799514/

相关文章:

javascript - 可播种的 JavaScript 随机数生成器

random - 真正的随机数生成器

Python线程处理数据库行

python - 为什么 PostgreSQL 适配器 psycopg2 在 Google App Engine dev_appserver.py 中失败?

javascript - 带有 if 语句的 do-while 循环中的随机数

go - 如何在golang中获取随机数样本?

ruby-on-rails - 在 Ruby on Rails 中播种

python - 修改 MinimalWordCount 示例以从 BigQuery 读取

python - 如何使用 python 将列从 CSV 文件转换为 json,以便键和值对来自 CSV 的不同列?

c# - C# 中分形 Perlin 噪声函数的均匀分布