从iPython重新加载moduel时,问题会植入PRNG

时间:2019-11-12 01:51:06

标签: python random ipython python-module random-seed

当我在iPython中(使用%run重新运行Python 3脚本时,当(a)有一个模块要重新加载并且(b)在该模块中时,我遇到了难以描述的问题,有一些随机数字生成的变量。

作为一个示例,我试图理解和解决这个问题,例如,我有两个python文件,一个叫做test.py,另一个叫做other.py

以下是test.py的内容:

import importlib
import numpy.random as rng

seed = 123
myRngEngine = rng.RandomState(seed)

import other
importlib.reload(other)
from other import *

print(var)

以下是other.py的内容:

from __main__ import *

var = myRngEngine.randint(0, 1000, 1)[0]

现在,我打开一个iPython控制台,然后输入:

%run /mypath/test.py 

我作为输出打印的数字是365。如果重复上述操作以重新运行脚本,则将得到510作为输出。从那时起,如果我重复一遍,我总是得到510。现在,我关闭iPython控制台,然后启动iPython控制台的新实例。再次,当我第一次进入上面的%run行时,我得到365作为输出,但是在所有后续尝试中,我都得到了510

问题:

(1)为什么会这样?

(2)如何解决这个问题,因为种子设置为相同,因此所有尝试都将导致完全相同的输出?

一个重要的细节是为什么我在test.py中执行以下操作:

import other
importlib.reload(other)
from other import *

真的需要这样的灵活性:每当我运行test.py时,都应该反映出我对other.py所做的任何更改,而不必重新启动iPython。

另一个重要的细节是为什么我要为other.py中的“全局”变量赋值,例如var。正是因为文件other.py可以作为config / global-variables文件工作-因此目前有此必要。

0 个答案:

没有答案