numpy.random.seed(0)是做什么的?

np.random.seed在Scikit-Learn教程的下面代码中做了什么? 我不是很熟悉NumPy的随机状态生成器的东西,所以我非常感谢外行人对此的解释。

np.random.seed(0) indices = np.random.permutation(len(iris_X)) 

np.random.seed(0)使随机数可以预测

 >>> numpy.random.seed(0) ; numpy.random.rand(4) array([ 0.55, 0.72, 0.6 , 0.54]) >>> numpy.random.seed(0) ; numpy.random.rand(4) array([ 0.55, 0.72, 0.6 , 0.54]) 

随着种子重置(每次),每次都会出现同一组数字。

如果随机种子没有被重置,每次调用都会出现不同的数字:

 >>> numpy.random.rand(4) array([ 0.42, 0.65, 0.44, 0.89]) >>> numpy.random.rand(4) array([ 0.96, 0.38, 0.79, 0.53]) 

(伪)随机数的工作是从一个数字(种子)开始,将其乘以一个大数,然后取模该产品。 然后将得到的数字用作种子来生成下一个“随机”数字。 当你设定种子(每次),它每次都做同样的事情,给你相同的数字。

如果你想看似随机数字,不要设置种子。 但是,如果您的代码使用了要debugging的随机数,那么在每次运行之前设置种子会非常有帮助,这样每次运行代码时都会执行相同的操作。

要获得每次运行最随机的数字,请调用numpy.random.seed() 。 这将导致numpy将种子设置为从/dev/urandom或其Windows模拟获得的随机数,或者,如果这两者都不可用,则将使用该时钟。

如果每次调用numpy的其他随机函数时设置np.random.seed(a_fixed_number) ,结果将是相同的:

在这里输入图像说明

但是,如果您只调用一次并使用各种随机函数,则结果将会不同:

在这里输入图像说明

如上所述,numpy.random.seed(0)将随机种子设置为0,所以从随机获得的伪随机数将从同一点开始。 在某些情况下,这可以很好地进行debugging。 但是,在阅读之后,这似乎是错误的方法,如果你有线程,因为它不是线程安全的。

来自于numpy-random-and-random-in-python之间的区别 :

对于numpy.random.seed(),主要的难点在于它不是线程安全的 – 也就是说,如果你有很多不同的执行线程是不安全的,因为如果两个不同的线程正在执行该function在同一时间。 如果你不使用线程,并且如果你可以合理地预期你将不需要以这种方式重写你的程序,numpy.random.seed()应该是罚款testing的目的。 如果有任何理由怀疑您将来可能需要线程,那么从长远来看,按照build议进行操作并创buildnumpy.random.Random类的本地实例会更安全。 据我所知,random.random.seed()是线程安全的(或至less,我没有find任何相反的证据)。

如何去做这个例子:

 from numpy.random import RandomState prng = RandomState() print prng.permutation(10) prng = RandomState() print prng.permutation(10) prng = RandomState(42) print prng.permutation(10) prng = RandomState(42) print prng.permutation(10) 

可能会给:

[3 0 4 6 8 2 1 9 7 5]

[1 6 9 0 2 7 8 3 5 4]

[8 1 5 0 7 2 9 4 3 6]

[8 1 5 0 7 2 9 4 3 6]

最后,请注意,有些情况下,由于xor的工作方式,初始化为0(而不是所有位为0的种子)可能导致对于一些第一次迭代的非均匀分布,但这取决于algorithm,超出了我目前的担忧和这个问题的范围。

通过使用np.Random.Seed(i),其中'i'可以是任何整数,您可以确保在生成随机数的同时,每次都以不同的顺序生成相同的一组数字,直到提供下一个种子