numpy 在本地和全局执行np.random.seed()的区别

wa7juj8i  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(93)

我想知道在函数内部和外部执行np.random.seed()的区别。比如...

np.random.seed(1)
def coin_toss():
    if np.random.randint(0,2) == 1:
        return 'HEAD'
    else:
        return 'TAIL'
for value in range (10): 
    print(coin_toss())

其输出为

HEAD
HEAD
TAIL
TAIL
HEAD
HEAD
HEAD
HEAD
HEAD
TAIL

另一方面,当我将np.random.seed(1)放入函数中时,我得到了不同的输出。

def coin_toss2():
    np.random.seed(1)
    if np.random.randint(0,2) == 1:
        return 'HEAD'
    else:
        return 'TAIL'
for value in range(10):
    print(coin_toss2())

其输出为

HEAD
HEAD
HEAD
HEAD
HEAD
HEAD
HEAD
HEAD
HEAD
HEAD

由于种子1在两个例子中是相同的,我希望得到相同的结果。是什么差异导致了输出的差异?有人能解释一下吗?我刚刚明白,在随机状态下也有全局和局部的概念。但我还是不明白为什么会有这种差异。

r55awzrz

r55awzrz1#

  • Seed* 是用于生成伪数的值。当前种子值是由random生成的前一个值。如果没有以前的种子可用,Numpy将使用系统时间作为默认值。

因此,一旦设置了一个种子并且从不手动更新它,以下随机操作总是在以前的值上生成。这就是你的第一个代码所做的。

np.random.seed(0)
np.random.randint(0, 10)
np.random.randint(0, 10)
np.random.randint(0, 10)
5
0
3

与第二个代码一样,每次调用random之前都要重置种子值。它合理地生成相同的值,因为它们的种子都是相同的。

np.random.seed(0)
np.random.randint(0, 10)
np.random.seed(0)
np.random.randint(0, 10)
np.random.seed(0)
np.random.randint(0, 10)
5
5
5
hi3rlvi2

hi3rlvi22#

注意测试全局与系统中的本地行为,可能与您预期的不同:https://github.com/lineality/random_seed_testing_python_empirical_coding

相关问题