详解Python seed()

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]=(aX[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

  • 22
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值