python -- np.random.seed()

seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。

所以seed总是跟random搭配使用。

作用机制:

设置seed()之后,np,random.random()按顺序产生一组固定的数组,遇到需要随机赋值的变量,就从这个固定的数组中取出对应数目的值赋给变量。
seed(n)的参数n决定了从这个固定数组的什么位置开始取值(个人猜测未找到相关描述),也就是每次遇到seed()之后都会按照后面的参数重新计算取值的起始位置。所以如果每次都调用seed(),那么取得值每次都一样,如下例:

num = 0
while(num<5):
    np.random.seed(2)
    print(np.random.random())
    num+=1

0.43599490214200376
0.43599490214200376
0.43599490214200376
0.43599490214200376
0.43599490214200376
np.random.seed(2)
num = 0
while(num<5):
    print(np.random.random())
    num+=1

0.43599490214200376
0.025926231827891333
0.5496624778787091
0.4353223926182769
0.42036780208748903

这个例子看似好像seed()失效了一样,其实不然,多次运行会发现结果会一直保持这几个数值不会变化,其实这个和上面那个例子主要的区别就是在seed()确定了取值的起始index之后,不仅仅只取一个值,而是在这个固定数组中接连取了5个值。

作用范围:

一旦设置,一直会影响该区域内的随机数。
这里做了个特别有意思的实验来验证这句话:

import numpy as np

A = np.random.randn(1,2)
print("A is:",A)

np.random.seed(2)
B = np.random.randn(1,3)
print("B is:", B)

注意,只在B前面设置了seed(),所以按道理来说每次B取得值都一样,而A应该都不一样,因为A应该是随机的嘛。
运行第一遍:

A is: [[-0.23406678  0.56739342]]
B is: [[-0.41675785 -0.05626683 -2.1361961 ]]

看不出来啥,别着急,继续运行:

A is: [[ 1.64027081 -1.79343559]]
B is: [[-0.41675785 -0.05626683 -2.1361961 ]]

果然B是“固定的”,A是“随机的”,真是这样么,再运行一次确认下:

A is: [[ 1.64027081 -1.79343559]]
B is: [[-0.41675785 -0.05626683 -2.1361961 ]]

去!A也“固定了”???!!!!!

尝试解释一下:第一次运行的时候完全OK,A随机,然后遇到seed(),产生一个固定数组,并由seed(2)中的参数2确定了起始index,叫origin_index吧,接着遇到了需要随机的B,那么就从origin_index开始在固定数组中取3个数给B。接着第二次运行了,注意这时已经有seed()了(它的作用域是多么的强大啊),那么遇到需要随机的A,当前的index是origin_index+3,那么就从这个位置开始,取2个给A。然后又遇到seed,重新计算index=origin_index,接着是B,继续从origin_index开始在固定数组中取3个数给B………………

以上仅为个人观点,如有错误,还望指正,不胜感激!

扫描二维码关注公众号,回复: 573835 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_41043240/article/details/80076844