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

时间:2016-06-18 00:48:28

标签: python random arguments argparse sys

我一直在研究一个使用随机数生成器的许多过程的模型。第一次,我曾经在每个需要使用随机生成数字的模块中调用import random。我像random.Random.seed(1)一样使用它,因为它足以在两个不同的时间运行模型并获得相同的结果,因为它生成了" 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()

1 个答案:

答案 0 :(得分:2)

看起来你不明白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() 可以这样使用:

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对象,您可以通过pickle保存它,并从该文件加载它。

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

讨论如何使用x.getstate()保存if(!fileOut.Open(lpFile, XFILE_SHARED, 1024*1024)) 以便在其他进程中使用。