Python中用于生成随机数的函数一般用
numpy.random.rand()
,它是一个用来生成0-1之间小数的函数,括号里的数字是n,它就生成一个n元向量,但是有时候在看代码的时候经常会看到numpy.random.seed()
,这个是干什么用的呢?接下来我们来了解一下。
计算机中其实不存在真正意义上的随机数,我们得到的随机数其实都是根据当前系统的时钟作为初始值,然后结合一定的算法生成的,所以计算机的随机其实是伪随机。而Python中的numpy.random.seed()
其实就是用来设置一个初始值,我们也称设置了一个随机数的种子。假设我们随机执行numpy.random.seed(589)
,程序会把这个特殊的数字——589作为种子,生成对应的初始值,如果你不是执行numpy.random.rand(1)
,而是numpy.random.rand(n)
,n>1,算法会根据初始值计算出向量中的下一个值,然后下下个值会根据它的上一次值计算得出,以此类推,从而得到一个随机值向量。这个随机数算法一般采用的是线性同余:
X
[
n
+
1
]
=
(
a
∗
X
[
n
]
+
b
)
m
o
d
c
X[n+1] = (a*X[n]+b)\mod c
X[n+1]=(a∗X[n]+b)modc
假设这里取
a
=
1
,
b
=
3
,
c
=
5
a=1, b=3, c=5
a=1,b=3,c=5,则得到
X
[
n
+
1
]
=
(
X
[
n
]
+
3
)
m
o
d
5
X[n+1] = (X[n]+3)\mod 5
X[n+1]=(X[n]+3)mod5
如果用
X
[
0
]
X[0]
X[0]作为种子,如下所示:
1. 若种子X[0]=0,向量为0, 3, 1, 4, 2, 0, ...
2. 若种子X[0]=1,向量为1, 4, 2, 0, 3, 1, ...
3. 若种子X[0]=2,向量为2, 0, 3, 1, 4, 2, ...
4. 若种子X[0]=3,向量为3, 1, 4, 2, 0, 3, ...
...
由此可见,当设置了相同的种子,那么初始值是一样的,而且算法又是固定的,所以生成的随机数向量就是相同的。因此,无论在何时何地,或者是在不同的计算机上,只要设置的种子是一样的,那么生成的随机数或者随机数向量肯定是一样的,我们来执行代码验证一下:
import numpy as np
np.random.rand(4)
# 结果如下:
# array([ 0.78014948, 0.15840532, 0.14821878, 0.40466582])
np.random.rand(4)
# 结果如下:
# array([ 0.09087485, 0.20738725, 0.13601299, 0.00138252])
np.random.seed(589)
np.random.rand(4)
# 结果如下:
# array([ 0.09397393, 0.14253276, 0.65864031, 0.79693907])
np.random.seed(589)
np.random.rand(4)
# 结果如下:
# array([ 0.09397393, 0.14253276, 0.65864031, 0.79693907])
可以看到,当没有设置种子时,运行np.random.rand(4)
输出的结果是不一样的;而当设置了种子,np.random.rand(4)
会输出相同的结果。
然而,有时候会遇到这种情况:
np.random.seed(500)
np.random.rand(4)
# 结果如下:
# array([ 0.69367953, 0.06171699, 0.6666116 , 0.55920894])
np.random.rand(4)
# 结果如下:
# array([ 0.08511062, 0.39241906, 0.49707753, 0.33214907])
奇怪了,我明明设置了种子,为什么两次结果会不一样。注意:这里虽然设置了种子,但是种子只能生效一次,它只会影响它最近一个生成随机数的程序,对之后的不起作用,所以要想得到相同的结果,必须重新指定相同的种子:
np.random.seed(500)
np.random.rand(4)
# 结果如下:
# array([ 0.69367953, 0.06171699, 0.6666116 , 0.55920894])
np.random.seed(500)
np.random.rand(4)
# 结果如下:
# array([ 0.69367953, 0.06171699, 0.6666116 , 0.55920894])
可以看到,当重新指定相同的种子,得到随机数的结果是相同的。
我们再来看一种情况:
np.random.seed(10)
np.random.rand(3)
# 结果如下:
# array([ 0.77132064, 0.02075195, 0.63364823])
np.random.seed(10)
np.random.rand(4)
# 结果如下:
# array([ 0.77132064, 0.02075195, 0.63364823, 0.74880388])
np.random.seed(10)
np.random.rand(5)
# 结果如下:
# array([ 0.77132064, 0.02075195, 0.63364823, 0.74880388, 0.49850701])
可以看到,在相同的种子下,无论想要生成的随机向量长度多大,初始值和算法都是相同的,后续的数得到的结果也都是相同的,直到向量所设置的长度为止。
OK,介绍了这么多关于Python seed()的含义和用法,那么,设置这个种子有什么意义?事实上,在做课题研究的时候,如果每次生成的随机数都是不一样的,不方便你研究得出结论;而且,当你给随机数设置了种子,可以方便别人复现你的研究,检验你的分析结果。所以,设置随机数种子还是很有必要的。
本文参考下面两篇博客,并融入了自己的思考:
https://blog.csdn.net/linzch3/article/details/58220569
https://www.jianshu.com/p/38d0a44630f8