写在前面的话:

第一次在该平台写东西,而且还是写自己不熟悉的东西哈哈哈。

最近不知道为什么突然对Python很感兴趣,以致于在大后天就要考试的此刻还是想来码一篇关于Python的random.seed()的一点粗鄙的心得。

可能以后我的一些想法、学习心得、日常记录或者是王者高光时刻(哈哈哈)都会在这里记录,算是对自己的一个印刻,便于以后的回忆。

好了不说废话了,对random.seed()的理解通过举例子的方式是最方便的了,先看几个例子:

例子1.1:

#代码
import numpy as np
np.random.seed()
for i in range(3):
print (np.random.random())
#结果(随机的)
0.46632459310108043
0.7544383753815331
0.39086069153119374
例子1.2:
#代码
import numpy as np
for i in range(3):
print (np.random.random())
#结果(随机的)
0.08574135682064832
0.8770426494456602
0.25749265725314274
以上两个例子告诉我们,如果你不对random.seed()传入参数,那写不写random.seed()这行代码都是一样的,程序照样对random.random()进行随机取值(从[0,1)区间随机取值)。
例子2.1:
#代码
import numpy as np
np.random.seed(1)
for i in range(3):
print (np.random.random())
#结果
0.417022004702574
0.7203244934421581
0.00011437481734488664
例子2.2:
#代码
import numpy as np
np.random.seed(1)
for i in range(5):
print (np.random.random())
#结果
0.417022004702574
0.7203244934421581
0.00011437481734488664
0.30233257263183977
0.14675589081711304
显然,例子2.2结果中的前三个数和例子2.1的三个数是完全一样的。原因是都设置了random.seed(1)。当你传入一个参数(这里是1)进去random.seed()中时,它会对后面的随机数的取值进行一个初始化(具体是如何初始化的,我问过Python玩得比较好的同学,他们讲到了伪随机数的概念,有兴趣的可以深究),并形成一个序列,这个序列里的数据是定了的。所以当例2.2设置5次循环时,前3次的结果和例2.1是一模一样的,因为这个序列是已经确定了的。有兴趣的可以循环10次,可以发现循环10次的结果的前5次数据和例2.2是一样的。
例子3.1:
#代码
import numpy as np
np.random.seed(1)
for i in range(3):
print (np.random.random())
#结果
0.417022004702574
0.7203244934421581
0.00011437481734488664
例子3.2:
#代码
import numpy as np
np.random.seed(2)
for i in range(3):
print (np.random.random())
#结果
0.43599490214200376
0.025926231827891333
0.5496624778787091
以上两例告诉我们,当你传入不同的参数(例3.1是1;例3.2是2)后,形成的这个序列是不一样的。
例子4.1:
#代码
import numpy as np
np.random.seed(1)
for i in range(3):
print (np.random.random())
#结果
0.417022004702574
0.7203244934421581
0.00011437481734488664
例子4.2:
#代码
import numpy as np
for i in range(3):
np.random.seed(1)
print (np.random.random())
#结果
0.417022004702574
0.417022004702574
0.417022004702574

以上两例可以看出random.seed()放在循环外面或是里面的区别:放在循环外面时(例4.1),在3次循环前,random.random()随机数的取值序列就定了,因此3个结果就是这个序列的第1、2、3个位置的数据;放在循环里面时(例4.2),循环1次,random.seed(1)调用一次,确定一个取值序列,而对于3次循环而言,random.seed(1)调用了3次,并且这3次循环都是同一个随机数序列,所以结果中的3个数是一样的(都是这个随机数序列的第1个数值)。

大多情况下应该都不需要设置random.seed(),如例1.2。当不设置random.seed()时,程序会根据系统时间来初始化随机数序列,因此你在不同时候调用random.random()时,都是不同的随机数序列。原因是在调用的时候,时间肯定都是不同的。