使用numpy.random.seeds(0)时出现奇怪的结果?

时间:2018-01-18 11:38:34

标签: python numpy random tensorflow

当使用numpy.random.seed(0)获得可重现的结果时,我发现了一些奇怪的东西。

import numpy as np
def a():
    print('a', np.random.rand())
    b()
def b():
    print('b', np.random.rand())
    c()
def c():
    print('c', np.random.rand())
np.random.seed(0)
a()

结果是:

a 0.5488135039273248
b 0.7151893663724195
c 0.6027633760716439

如果我将代码更改为:

import numpy as np
def a():
    np.random.seed(0)
    print('a', np.random.rand())
    b()
    print('aa', np.random.rand())
def b():
    np.random.seed(0)
    print('b', np.random.rand())
    c()
def c():
    np.random.seed(0)
    print('c', np.random.rand())

a()

结果如下:

a 0.5488135039273248
b 0.5488135039273248
c 0.5488135039273248
aa 0.7151893663724195

这真的很奇怪,我使用tensorflow来训练我的财务序列预测模型,我希望得到可重复的结果。似乎我需要在每次使用随机函数之前调用np.random.seeds()。谁有更好的解决方案?

2 个答案:

答案 0 :(得分:3)

random.seed(int)

初始化一个随机生成器,它始终具有相同的“随机”数字列表。在您的代码中,您在每个过程中初始化生成器。但是当你打印aa时,你的生成器会跳转到另一个数字。

答案 1 :(得分:1)

在每次通话之前,您正在重新初始化rng的种子。 rng的工作方式是在初始化种子后给出“随机”数字。在你的情况下,种子总是相同的,它每次只给你序列的第一个值。

p

我认为这是一个复制粘贴错误,因为你在第一个例子中说得对。无论如何你在这里有一些关于rng的信息。 Wikipedia RNG