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