此处讨论的随机种子适用于random模块,numpy, torch等。我们将以random模块为例。
1.随机数到底怎么生成的
python中的随机数其实是所谓的“伪随机数”,它的生成并不是完全无迹可寻的。伪随机数生成器通过对“某个值”执行系列操作来获得伪随机值。 通常,这“某个值”来自上一个随机数生成器生成的值。 但是,当你新打开一个程序时,没有由上一个伪随机数生成器产生的值,这时系统就会为你定一个初始值(可能根据日期,时间啥的,可以认为是无法被推断的),通过这个值你可以一路往下走。
2.为何是“伪随机”
当我们从上图可以看到,值1是由当时的系统环境决定的,那我们是否能控制值1呢?答案是肯定的。
我们可以通过random.seed()这个函数来给值1设置一个值,使得它成为接下来所有值的”种子”
让我们来看一下接下来的例子(两个例子都是在python3.x环境下):
当我在windows系统以9001为种子时,多次运行某个伪随机生成器(random.randint),会得到这样一个序列(1, 5, 5,2,10)。
当我在linux系统以9001为种子时,多次运行某个伪随机生成器(random.randint),会得到这样一个序列(1, 5, 5,2,10)。
通过这个例子我们可以发现
1. 在定下值1(也就是随机种子)后,整个随机序列就已经确定了下来。这就是所谓的“伪”。
2. 请注意上述例子中第五个和第六个伪随机数生成器(random.randint),他们接收的“某个值”都是5,但生成的数却不一样(一个是5,一个是2)。这就是所谓的“随机”
3.为何要设置随机种子
假象这样一种情况,我们对拥有随机操作的两个程序完成了A和B两个版本,那如果我们要比较A和B性能的时候,由于程序内部的随机性,我们的直接比较是很难说明问题的。
那如果我们给A,B在程序的开始都设置同一个随机种子,那么比较将很容易进行,又保证了内部的随机操作。
这只是一个例子,总的来说,设置随机种子让我们的对比和复现十分直观。
4.设置随机种子
import random, torch
import numpy as np
seed = 9001
random.seed(seed)
torch.manual_seed(seed) #CPU
torch.cuda.manual_seed(seed) #GPU
np.random.seed(seed)
参考链接:
https://blog.csdn.net/linzch3/article/details/58220569
https://stackoverflow.com/questions/22639587/random-seed-what-does-it-do/22639752#22639752