np.random.seed() 随机数种子
1. 随机数种子的理解:
相当于我给接下来需要生成的随机数一个初值,按照我给的这个初值,按固定顺序生成随机数。
通俗一点理解为: 随机数种子是给了一批数(随机数种子应该是按一定顺序生成随机数的,并不是一次给了一批数,但如果这些数有固定顺序,我们是不是可以简单认为随机种子给了我们很多数据),当需要生成随机数时,就从这一批数中依次取值。
第一个例子
np.random.seed(0) # 先定义一个随机数种子
print(np.random.rand(5)) # "随机"生成5个数
print(np.random.rand(5)) # 再"随机"生成5个数
np.random.seed(0)
for i in range(7):
print(np.random.random()) # "随机"生成7个数
从下面的输出结果中,我们可以察觉,“随机”并不是真的随机,是假随机。
# 结果
[0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
[0.64589411 0.43758721 0.891773 0.96366276 0.38344152]
0.5488135039273248
0.7151893663724195
0.6027633760716439
0.5448831829968969
0.4236547993389047
0.6458941130666561
0.4375872112626925
观察结果:下边的 ‘ 随机 ’ 生成的7个数和上边 ‘ 随机 ’ 生成的十个数中的前7个相同。
为什么呢?
因为开始我们设置了一个随机种子,接下来生成的十个数是有固定顺序的(这顺序是什么?i dont know!)。为了方便理解,我们把随机种子看成一个超级超级长的 list ,我们接下来的取随机数操作,( np.random.rand(5) )就是从这个 list 中依次取5个随机数,然后( np.random.rand(5) )再取5个随机数。当然,你说它不是 list 是 数组 ,OK!随你,只是为了方便理解。
为什么后边生成的7个 “随机” 数和之前的前7个数相同呢?
这是因为在生成这7个 ‘随机’ 数之前,又重新定义了一个随机数种子 ( np.random.seed(0) )。定义随机数种子,不就是定义了一个超级超级长的 list 吗 ?,这个 list 和之前的 list 是一样的!!!,所以我们取7个 ‘随机’ 数,不就是这个 list 中的前7个吗!
第二个例子
np.random.seed(0)
for i in range(7):
print(np.random.random())
np.random.seed(0)
print(np.random.rand(2, 3))
0.5488135039273248
0.7151893663724195
0.6027633760716439
0.5448831829968969
0.4236547993389047
0.6458941130666561
0.4375872112626925
[[0.5488135 0.71518937 0.60276338]
[0.54488318 0.4236548 0.64589411]]
2 x 3 矩阵的6个数 和 随机生成的前6个数相同!不需要解释了吧,所以如果我想生成两个一样的随机矩阵怎么办?是不是在生成矩阵前,定义随机数种子就好了。
总结:
(1)随机数种子相当于给我们一个初值,之后按照固定顺序生成随机数(也就是我们说的超级长的 list )
(2)随机数种子对后面的结果一直有影响,在一个随机数种子后生成的随机数都受这个随机数种子的影响,即生成的随机数都是由这个随机数种子给的初值,按照固定顺序生成的(生成的随机数受离它最近的随机数种子影响,即它之前的随机数种子)。
2. np.random.seed()的参数:
个人理解:随机数种子给的初值和顺序是一个意思,因为这个顺序并不知道,所以可以认为是由初值决定,也可以理解为生成的超级超级大的 list 。
那这个初值是怎么决定的呢,是np.random.seed()中的参数决定,只要每次这个参数相同,那我们的初值就是相同的,种子就是相同的。
种子相同,之后长得枝条就是相同的: 即 list 是相同的。
例子
np.random.seed(0)
print(np.random.rand(2, 3))
np.random.seed(1)
print(np.random.rand(2, 3))
np.random.seed(0)
print(np.random.rand(2, 3))
[[0.5488135 0.71518937 0.60276338]
[0.54488318 0.4236548 0.64589411]]
[[4.17022005e-01 7.20324493e-01 1.14374817e-04]
[3.02332573e-01 1.46755891e-01 9.23385948e-02]]
[[0.5488135 0.71518937 0.60276338]
[0.54488318 0.4236548 0.64589411]]