如何将 fixed_seed 从 main.py 模块传输到其他模块?

How can I transfer a fixed_seed from main.py module to other modules?

我一直在研究一个模型,该模型有许多使用随机数生成器的进程。第一次,我曾经在每个需要使用随机生成数字的模块中调用 import random。我像 random.Random.seed(1) 一样使用它,因为它足以 运行 两次不同的模型并得到相同的结果,因为它在 "parameters" 模块中生成了 "fixed_seed"。

问题是有很多调用过程需要调用parameters模块,它重新创建了fixed_seed。事实上,每个模拟月都会获得相同的随机数生成器种子。

所以我尝试将这个 fixed_seed 创建从参数转移到主模块,但我无法使用 sys 或 argparse 库来转移 fixed_seed

我的例子:

############################################
# in the main model
############################################
import argparse
import random

# creating the fixed seed random generator 
fixed_seed = random.Random(0)

# transfering the fixed_seed to other modules
parser = argparse.ArgumentParser()
parsed_args = parser.parse_args(fixed_seed)

###############################################
# importing the fixed_seed in the other module
###############################################
import argparse

parser = argparse.ArgumentParser()
fixed_seed = parser.parse_args()

您似乎不明白 parser 从哪里获取参数,以及当您进行解析时会发生什么。

解析器不是状态机,因此它不保存有关它所解析内容的信息或将其传递给其他解析器。

调用脚本时,例如

$ python mycode.py one two three

shell 和解释器将该命令行拆分为字符串并设置 sys.argv 变量

import sys
print(sys.argv)

应该显示:

['mycode', 'one', 'two', 'three]

第一个字符串是 prog 名称,其余 sys.argv[1:] 被解析。

所以

args = parser.parse_args()

相同
args = parser.parse_args(sys.argv[1:])

在这种情况下

args = parser.parse_args(['one', 'two', 'three'])

考虑到这一点,考虑这一行:

parsed_args = parser.parse_args(fixed_seed)

您将 fixed_seed 定义为 random.Random(0)。这是一个用 0 播种的随机数生成器(一个对象)。它不是像 sys.argv 这样的字符串列表。我确定会产生错误

我怀疑您正试图将 fixed_seed 保存在另一个使用 argparse 的地方。 argparse 不是这样使用的。

=========================

您可以使用任何 hashable 设置随机种子,包括字符串。因此,如果您在两个不同的进程中执行 x = random.Random('onetwo')x.random() 将生成相同的随机数。

所以argparse可以这样使用:

import argparse
import random

parser = argparse.ArgumentParser()
parser.add_argument('seed')
args = parser.parse_args()
x = random.Random(args.seed)
for _ in range(3):
    print x.random()

只要你给每个调用相同的 'seed' 词,随机数就应该相同。

1926:~/mypy$ python stack37892221.py one
0.438175178474
0.0834683812319
0.43595707944
1926:~/mypy$ python stack37892221.py one
0.438175178474
0.0834683812319
0.43595707944
1926:~/mypy$ python stack37892221.py two
0.183364783476
0.195633546206
0.877462699471

如果不是传递 seed 字符串,而是需要传递 Random 对象,您可以通过 Pickle 保存它,然后从该文件加载它.

https://pymotw.com/2/random/#saving-state

谈论使用 pickle 保存 x.getstate() 以供在另一个进程中使用。