一、背景
numpy.random.seed函数在网上有很多文章都被讲解过,但是还是没有讲到核心,没把更深层次的作用机理讲出来。
二、生活中的比喻
1.1取扑克牌
假设某厂在不同时间点生产不同型号的扑克牌,每一种型号的扑克对应的每一盒从上到下的排序相同;以型号A为例,每一盒从上到下的排列顺序是123456789...。
我现在给你一盒这种型号A的扑克,让你从上到下依次取出,第一次取出1,第二次取出2后。
再给你一盒型号A扑克牌,再第一次取出1,第二次取出2。
1.2建立关联
(1)在不同时间生产不同型号的扑克牌,也即如果甲方不指定型号,生成的扑克牌顺序就和时间有关。
(2)不同型号的扑克牌排列顺序不同,也即不同数值的seed对应的序列不同。
(3)(重新)给你一幅型号A扑克牌让你取,也即(重新)应用一次numpy.random.seed(A)再取随机数。
(4)只要不再(重新)给你一幅新的型号A扑克牌,那么你只能接着上次取完的顺序继续;也即numpy.random.seed(A)的作用不是只有一次,而是一直持续,后面取随机数的序列固定不变,如果numpy.random.seed(9)对应的序列是123456789,第一次生成随机数是1,第二次生成随机数前虽然不再次执行umpy.random.seed(9),也会受它的影响而生成2。
三、具体代码示意
import numpy as np
np.random.seed(3)
for i in range(5):
print(np.random.rand())
np.random.seed(3)
print(np.random.rand(5))
# 0.5507979025745755
# 0.7081478226181048
# 0.2909047389129443
# 0.510827605197663
# 0.8929469543476547
# [0.5507979 0.70814782 0.29090474 0.51082761 0.89294695]
看没看到?中间的代码块,只执行一次random.seed,依次取出的序列和后面一次性取出5个的序列数值大小相同(忽略精度影响)。
所以,别说random.seed只作用一次了,它会作用到程序执行结束,会作用到下一次random.seed出现。