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