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

Python 如何将固定种子从main.py模块传输到其他模块?,python,random,arguments,argparse,sys,Python,Random,Arguments,Argparse,Sys,我一直在研究一个模型,它有许多使用随机数生成器的进程。第一次,我在需要使用随机生成的数字的每个模块中调用import random。我使用了类似于random.random.seed(1)的方法,由于它在“参数”模块中生成了“固定种子”,因此足以运行两次不同的模型并获得相同的结果 问题是有许多调用过程需要调用参数模块,它需要重新创建固定种子。事实上,每个模拟月都会得到相同的随机数生成器种子 因此,我尝试将此fixed_seed创建从参数传输到主模块,但无法使用sys或argparse库传输fix

我一直在研究一个模型,它有许多使用随机数生成器的进程。第一次,我在需要使用随机生成的数字的每个模块中调用
import random
。我使用了类似于
random.random.seed(1)
的方法,由于它在“参数”模块中生成了“固定种子”,因此足以运行两次不同的模型并获得相同的结果

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

因此,我尝试将此
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://code>将被解析

所以

args = parser.parse_args(sys.argv[1:])
在这种情况下

args = parser.parse_args(['one', 'two', 'three'])
考虑到这一点,请考虑这条线:

parsed_args = parser.parse_args(fixed_seed)
您将
fixed\u seed
定义为
random.random(0)
。这是一个种子为
0
的随机数生成器(对象)。它不是像
sys.argv
那样的字符串列表。我确信这会产生一个错误

我怀疑您正试图将
固定种子
保存到另一个使用
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
如果不需要传递
种子
字符串,而需要传递
随机
对象,则可以通过
Pickle
保存该对象,并从该文件加载该对象


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

Hi@hpaulj我的需要就是这样。我需要在主模块中生成“fixed_seed”,并在需要时在更多的7个模块中使用它。那么,我该怎么办在主模型导入random#创建固定种子随机生成器fixed_seed=random.random(0)#导入其他模块中的固定种子导入sys fixed_seed=sys.argv[1]查看我的新
保存状态
链接。谢谢@hpaulj!!!工作很好,解决了我的问题!我第一次在每个模块的main、pickle和load中创建了一个随机状态。之后,在模拟的其他月份,每个模块转储并加载自己的“状态”随机种子!干杯
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