gpt4 book ai didi

python - 如何将固定种子从 main.py 模块传输到其他模块?

转载 作者:行者123 更新时间:2023-12-01 03:53:33 24 4
gpt4 key购买 nike

我一直在研究一个具有许多使用随机数生成器的进程的模型。第一次,我曾经在每个需要使用随机生成数字的模块中调用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()

最佳答案

看起来您不明白解析器从哪里获取参数,以及进行解析时会发生什么。

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

当您调用脚本时,例如

$ 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 的使用方式。

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

您可以使用任何可哈希(包括字符串)设置随机种子。因此,如果您在两个不同的进程中执行 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()

只要您为每个调用提供相同的“种子”词,随机数就应该相同。

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

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

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

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

关于python - 如何将固定种子从 main.py 模块传输到其他模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37892221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com