• 售前

  • 售后

热门帖子
入门百科

Python随机数种子(random seed)的利用

[复制链接]
462710480 显示全部楼层 发表于 2021-8-14 12:41:36 |阅读模式 打印 上一主题 下一主题
目次


  • 1. 随机数种子
  • 2. numpy中的随机数种子
  • 3. 随机数“序次”的奥秘
在科学技术和呆板学习等其他算法相关使掷中,我们常常须要用到随机数,为了把握随机数的天生特性,从随机数的随机无序中得到确定和秩序。我们可以利用随机数种子(random seed)来实现这一目标,随机数种子,可以使得引入了随机数的整个程序,在多次运行中得到确定的,同等的效果。
许多博文谈到随机数种子,只是简朴论及,利用随机数种子,可以每次天生相同的随机数。想真正用好把握它,对此很容易产生迷惑,天生相同的随机数数怎么个相同法?随机数种子又作何用处?

1. 随机数种子


下面我们从实例中揭开随机数种子的秘密面纱:
  1. import random
  2. # print(help(random))
  3. def test_random_seed_in_std_lib(seed=0, cnt=3):
  4.     random.seed(seed)
  5.     print("test seed: ", seed)
  6.     for _ in range(cnt):
  7.         print(random.random())
  8.         print(random.randint(0,100))
  9.         print(random.uniform(1, 10))
  10.         print('\n')
  11. test_random_seed_in_std_lib()
  12. test seed:  0
  13. 0.8444218515250481
  14. 97
  15. 9.01219528753418
  16. 0.04048437818077755
  17. 65
  18. 5.373349269065314
  19. 0.9182343317851318
  20. 38
  21. 9.710199954281542
  22. test_random_seed_in_std_lib()
  23. test seed:  0
  24. 0.8444218515250481
  25. 97
  26. 9.01219528753418
  27. 0.04048437818077755
  28. 65
  29. 5.373349269065314
  30. 0.9182343317851318
  31. 38
  32. 9.710199954281542
  33. test_random_seed_in_std_lib(99)
  34. test seed:  99
  35. 0.40397807494366633
  36. 25
  37. 6.39495190686897
  38. 0.23026272839629136
  39. 17
  40. 7.8388969285727015
  41. 0.2511510083752201
  42. 49
  43. 5.777313434770537
复制代码
通过两次运行以上程序,我们得到相同的效果,这阐明了以下几点:
       
  • 在确定了一次随机数种子后,随机数函数,无论任何分布任何类型,在多次重复调用中(for循环)天生的随机数差异;   
  • 当再次声明相同的随机数种子时(第二次调用test_random_seed_in_std_lib函数,random.seed(seed)这一行),随机数将从“头”开始, 按相同的序次天生随机数。这里的“头”,便是random.seed(seed)声明后,随机数函数的首次调用;   
  • 若指定差异的随机数种子(seed=99),无论任何随机数函数,天生的随机数将差异于,之前的(随机数种子为0)的运行效果。   
  • 上面的几点表明了随机数种子可以使得每次天生相同随机数的具体寄义。这里的相同,其实另有一种更广泛的内在,即情况独立和跨平台。上面的实验,在任何电脑或主机,运行以上代码,可以复现完全同等的效果。
以上几点囊括了随机数种子的根本特性,下面我们来对numpy中的随机数种子作进一步的拓展研究。

2. numpy中的随机数种子

  1. import numpy as np
  2. def test_numpy_random_seed(seed=0, cnt=3):
  3.     np.random.seed(seed)
  4.     print("test numpy seed: ", seed)
  5.     for _ in range(cnt):
  6.         print(np.random.random())
  7.         print(np.random.randn(1, 5))
  8.         print(np.random.uniform(1, 10, 5))
  9.         print('\n')
复制代码
多次运行以上的test_numpy_random_seed函数,你可以观察到与利用random模块时相似的情况,进一步验证了我们总结的关于随机数种子的特性。
此外,我们可以对多维随机数组做一些有益的探索:
  1. def test_mult_shape(seed=0):
  2.     np.random.seed(seed)
  3.     print(np.random.randn(1, 3))
  4.     print(np.random.randn(1, 2))
  5.     np.random.seed(seed)
  6.     print(np.random.randn(2, 5))
  7. test_mult_shape()
  8. [[1.76405235 0.40015721 0.97873798]]
  9. [[2.2408932  1.86755799]]
  10. [[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799]
  11. [-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]]
复制代码
运行test_mult_shape函数,我们发现,设定相同的随机数组,两次运行两个一行的多维正态分布的效果,与一次运行两行的多维正态分布的效果的第一行完全相同。
这个效果,阐明了对相同类型的随机数分布,形状特性不会影响分布的天生秩序,程序中,np.random.randn(1, 2),这一行不像是第二次运行多维正态分布的随机数组,它"险些"是后缀于它的前一行一次性天生的。

3. 随机数“序次”的奥秘


至此,我们对随机数天生序次有了开端印象,但是这里的序次,其实比我们的朴素观察更复杂,我们来进一步考察这一点。
  1. def test_numpy_random_seed_order(seed=0):
  2.     np.random.seed(seed)
  3.     print(np.random.random())
  4.     # print(np.random.randint(1, 10))
  5.     print(np.random.randn(1, 5))
  6.     np.random.seed(seed)
  7.     print(np.random.randn(2, 5))
  8. test_numpy_random_seed_order()
  9. 0.5488135039273248
  10. [[ 0.74159174  1.55291372 -2.2683282   1.33354538 -0.84272405]]
  11. [[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799]
  12. [-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]]
复制代码
运行以上程序,我们看到,设定了相同的随机数种子,np.random.randn(1, 5)看起来是第一次运行多维正态分布数组,实际上并不是,np.random.randn(2, 5)才是真正的第一次运行多维正态分布随机数组。
这阐明,前面的np.random.random()对np.random.randn产生了干扰,使得这次正态分布的随机数组中的任何一个数,都不在np.random.randn(2, 5)中,这样它表现了一种不可把握的随机性。
我们可以把这一点考察得更加深入一点:
  1. def test_numpy_random_seed_order_further(seed=0, randint_high=10):
  2.     np.random.seed(seed)
  3.     print(np.random.randint(1, randint_high))
  4.     print(np.random.randn(1, 5))
  5.     np.random.seed(seed)
  6.     print(np.random.randn(2, 5))
  7. test_numpy_random_seed_order_further()
  8. 6
  9. [[ 0.11849646  0.11396779  0.37025538  1.04053075 -1.51698273]]
  10. [[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799]
  11. [-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]]
  12. test_numpy_random_seed_order_further(randint_high=5)
  13. 1
  14. [[ 1.12279492  0.30280522  0.07085926  0.07304142 -1.42232584]]
  15. [[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799]
  16. [-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]]
复制代码
紧接上面对随机数干扰项对考察,我们看到,这次我们改变了干扰项随机数天生器,np.random.randn(1, 5)的天生效果差异于test_numpy_random_seed_order中同一行的运行效果。
别的,两次设置差异的randint的右边界,np.random.randn(1, 5)天生的效果也全然差异,这阐明了np.random.randint设置差异的参数,便是全然差异的随机数发生器。这一点,也不难在其他类型的随机数分布中得到验证。

到此这篇关于Python随机数种子(random seed)的利用的文章就介绍到这了,更多相关Python随机数种子内容请搜刮脚本之家以前的文章或继续欣赏下面的相关文章盼望大家以后多多支持脚本之家!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作