ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python(np.random.seed())

2020-01-30 18:56:28  阅读:208  来源: 互联网

标签:python random 生成 seed 种子 随机数 np


转载博文链接:https://blog.csdn.net/weixin_38171245/article/details/99807417

------------恢复内容开始------------

首先显示一段代码:

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



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

运行结果:

0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
-------------------------
0.43599490214200376
0.025926231827891333
0.5496624778787091
0.4353223926182769
0.42036780208748903

Process finished with exit code 0

讲解:

seed( ) 用于指定随机数生成时所用算法开始的整数值。 

  1.如果使用相同的seed( )值,则每次生成的随即数都相同; 

  2.如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。 

  3.设置的seed()值仅一次有效

所谓随机数其实是伪随机数,所谓的‘伪’,意思是这些数其实是有规律的,只不过因为算法规律太复杂,很难看出来。再厉害的算法,没有一个初始值,它也不可能凭空造出一系列随机数来,我们说的种子就是这个初始值。

random随机数是这样生成的:我们将这套复杂的算法(是叫随机数生成器吧)看成一个黑盒,把我们准备好的种子扔进去,它会返给你两个东西,一个是你想要的随机数,另一个是保证能生成下一个随机数的新的种子,把新的种子放进黑盒,又得到一个新的随机数和一个新的种子,从此在生成随机数的路上越走越远。

再看我们的代码:

第一段代码把对种子的设置放在了循环里面,每次执行循环都旗帜鲜明地告诉黑盒:“我的种子是1”。那么很显然:同一个黑盒,同一个种子,自然得到的是同一个随机数。

第二段代码把对种子的设置放在了循环外面,他只在第一次循环的时候明确地告诉黑盒:“我的种子是2”。那么也很显然:从第二次循环开始,黑盒用的就是自己生成的新种子了。

多说一句:因为黑盒是始终如一的,所以只要你没改变种子,那么你得到的随机数就不会改变。

没有特殊需求的话,还是老老实实地用Python自动选择的种子吧,省心又省力。

 

深入理解:

在使用numpy时,难免会用到随机数生成器。一直对np.random.seed(),随机数种子搞不懂。很多博客也就粗略的说,利用随机数种子,每次生成的随机数相同。

两个疑惑:1, 利用随机数种子,每次生成的随机数相同。这是什么意思?

     2,随机数种子的参数怎么选择?在别人的代码中经常看到np.random.seed(Argument),这个参数不一样,有的是0,有的是1,当然还有其他数。那这个参数应该怎么选择呢?

通过对别的博客的理解,我做了以下几组实验:

 

import numpy as np

if __name__ == '__main__':
    i = 0
    while(i<6):
        if(i<3):
            np.random.seed(0)
            print(np.random.randn(1, 5))
        else:
            print(np.random.randn(1, 5))
            pass
        i += 1
    i = 0
    while(i<2):
        print(np.random.randn(1, 5))
        i += 1
    print(np.random.randn(2, 5))
    np.random.seed(0)
    i = 0
    while(i<8):
        print(np.random.randn(1, 5))
        i += 1

运行结果:

  1.   [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  2.   [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  3.   [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  4.   [[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
  5.   [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
  6.   [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
  7.   [[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
  8.   [[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
  9.   [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]
  10.   [ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]
  11.   [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  12.   [[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
  13.   [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
  14.   [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
  15.   [[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
  16.   [[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
  17.   [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]]
  18.   [[ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]
  19.    

  

通过该实验我们可以得到以下结论:

1.1.可以看出,像http://blog.csdn.net/linzch3/article/details/58220569这篇博客中提到的,np.random.seed()对后面的随机数一次有效,而不是一直有效,这种说法是错误的。

两次利用随机数种子后,即便是跳出循环后,生成随机数的结果依然是相同的。第一次跳出while循环后,进入第二个while循环,得到的两个随机数组确实和加了随机数种子不一样。但是,后面的加了随机数种子的,八次循环中的结果和前面的结果是一样的。说明,随机数种子对后面的结果一直有影响。同时,加了随机数种子以后,后面的随机数组都是按一定的顺序生成的。

1.2.在同样的随机种子后第六次的随机数生成结果,(结果高亮部分),两行五列的数组和两个一行五列的数组结果相同。说明,在生成多行随机数组时,是由单行随机数组组合而成的。

现在我们回答了第一个疑惑:利用随机数种子,每次生成的随机数相同。这是什么意思? --就是使后面的随机数按一定的顺序生成。

import numpy as np

if __name__ == '__main__':
    i = 0
    np.random.seed(0)
    while(i<3):
        print(np.random.randn(1, 5))
        i += 1
    i = 0
    np.random.seed(1)
    i = 0
    while(i<3):
        print(np.random.randn(1, 5))
        i += 1
[[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799]]
[[-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]]
[[ 0.14404357  1.45427351  0.76103773  0.12167502  0.44386323]]

[[ 1.62434536 -0.61175641 -0.52817175 -1.07296862  0.86540763]]
[[-2.3015387   1.74481176 -0.7612069   0.3190391  -0.24937038]]
[[ 1.46210794 -2.06014071 -0.3224172  -0.38405435  1.13376944]]

你可以实验,在你的电脑上,当随机数种子参数为0和1时,生成的随机数和我上面高亮的结果相同。说明该参数指定了一个随机数生成的起始位置。每个参数对应一个位置。并且在该参数确定后,其后面的随机数的生成顺序也就确定了。

所以,现在我们回答了我的第二个疑问:随机数种子的参数怎么选择?我认为随意,这个参数只是确定一下随机数的起始位置。

------------恢复内容结束------------

首先显示一段代码:

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

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

运行结果:

0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
0.417022004702574
-------------------------
0.43599490214200376
0.025926231827891333
0.5496624778787091
0.4353223926182769
0.42036780208748903

Process finished with exit code 0

讲解:

seed( ) 用于指定随机数生成时所用算法开始的整数值。 

  1.如果使用相同的seed( )值,则每次生成的随即数都相同; 

  2.如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。 

  3.设置的seed()值仅一次有效

所谓随机数其实是伪随机数,所谓的‘伪’,意思是这些数其实是有规律的,只不过因为算法规律太复杂,很难看出来。再厉害的算法,没有一个初始值,它也不可能凭空造出一系列随机数来,我们说的种子就是这个初始值。

random随机数是这样生成的:我们将这套复杂的算法(是叫随机数生成器吧)看成一个黑盒,把我们准备好的种子扔进去,它会返给你两个东西,一个是你想要的随机数,另一个是保证能生成下一个随机数的新的种子,把新的种子放进黑盒,又得到一个新的随机数和一个新的种子,从此在生成随机数的路上越走越远。

再看我们的代码:

第一段代码把对种子的设置放在了循环里面,每次执行循环都旗帜鲜明地告诉黑盒:“我的种子是1”。那么很显然:同一个黑盒,同一个种子,自然得到的是同一个随机数。

第二段代码把对种子的设置放在了循环外面,他只在第一次循环的时候明确地告诉黑盒:“我的种子是2”。那么也很显然:从第二次循环开始,黑盒用的就是自己生成的新种子了。

多说一句:因为黑盒是始终如一的,所以只要你没改变种子,那么你得到的随机数就不会改变。

没有特殊需求的话,还是老老实实地用Python自动选择的种子吧,省心又省力。

 

深入理解:

在使用numpy时,难免会用到随机数生成器。一直对np.random.seed(),随机数种子搞不懂。很多博客也就粗略的说,利用随机数种子,每次生成的随机数相同。

两个疑惑:1, 利用随机数种子,每次生成的随机数相同。这是什么意思?

     2,随机数种子的参数怎么选择?在别人的代码中经常看到np.random.seed(Argument),这个参数不一样,有的是0,有的是1,当然还有其他数。那这个参数应该怎么选择呢?

通过对别的博客的理解,我做了以下几组实验:

 

import numpy as np

if __name__ == '__main__':
    i = 0
    while(i<6):
        if(i<3):
            np.random.seed(0)
            print(np.random.randn(1, 5))
        else:
            print(np.random.randn(1, 5))
            pass
        i += 1
    i = 0
    while(i<2):
        print(np.random.randn(1, 5))
        i += 1
    print(np.random.randn(2, 5))
    np.random.seed(0)
    i = 0
    while(i<8):
        print(np.random.randn(1, 5))
        i += 1

运行结果:

  1.   [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  2.   [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  3.   [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  4.   [[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
  5.   [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
  6.   [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
  7.   [[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
  8.   [[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
  9.   [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]
  10.   [ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]
  11.   [[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
  12.   [[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
  13.   [[ 0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]]
  14.   [[ 0.33367433 1.49407907 -0.20515826 0.3130677 -0.85409574]]
  15.   [[-2.55298982 0.6536186 0.8644362 -0.74216502 2.26975462]]
  16.   [[-1.45436567 0.04575852 -0.18718385 1.53277921 1.46935877]]
  17.   [[ 0.15494743 0.37816252 -0.88778575 -1.98079647 -0.34791215]]
  18.   [[ 0.15634897 1.23029068 1.20237985 -0.38732682 -0.30230275]]
  19.    

  

通过该实验我们可以得到以下结论:

1.1.可以看出,像http://blog.csdn.net/linzch3/article/details/58220569这篇博客中提到的,np.random.seed()对后面的随机数一次有效,而不是一直有效,这种说法是错误的。

两次利用随机数种子后,即便是跳出循环后,生成随机数的结果依然是相同的。第一次跳出while循环后,进入第二个while循环,得到的两个随机数组确实和加了随机数种子不一样。但是,后面的加了随机数种子的,八次循环中的结果和前面的结果是一样的。说明,随机数种子对后面的结果一直有影响。同时,加了随机数种子以后,后面的随机数组都是按一定的顺序生成的。

1.2.在同样的随机种子后第六次的随机数生成结果,(结果高亮部分),两行五列的数组和两个一行五列的数组结果相同。说明,在生成多行随机数组时,是由单行随机数组组合而成的。

现在我们回答了第一个疑惑:利用随机数种子,每次生成的随机数相同。这是什么意思? --就是使后面的随机数按一定的顺序生成。

import numpy as np

if __name__ == '__main__':
    i = 0
    np.random.seed(0)
    while(i<3):
        print(np.random.randn(1, 5))
        i += 1
    i = 0
    np.random.seed(1)
    i = 0
    while(i<3):
        print(np.random.randn(1, 5))
        i += 1
[[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799]]
[[-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]]
[[ 0.14404357  1.45427351  0.76103773  0.12167502  0.44386323]]

[[ 1.62434536 -0.61175641 -0.52817175 -1.07296862  0.86540763]]
[[-2.3015387   1.74481176 -0.7612069   0.3190391  -0.24937038]]
[[ 1.46210794 -2.06014071 -0.3224172  -0.38405435  1.13376944]]

你可以实验,在你的电脑上,当随机数种子参数为0和1时,生成的随机数和我上面高亮的结果相同。说明该参数指定了一个随机数生成的起始位置。每个参数对应一个位置。并且在该参数确定后,其后面的随机数的生成顺序也就确定了。

所以,现在我们回答了我的第二个疑问:随机数种子的参数怎么选择?我认为随意,这个参数只是确定一下随机数的起始位置。

标签:python,random,生成,seed,种子,随机数,np
来源: https://www.cnblogs.com/shiheyuanfang/p/12243422.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有