np.random.seed()和np.random.RandomState()的区别
我知道为了让numpy.random生成的随机数是可重复的,我应该使用:
import numpy as np
np.random.seed(1234)
但是
np.random.RandomState()
到底是干什么的呢?
6 个回答
0
Seed
是一个全局的伪随机数生成器。也就是说,它会影响到整个程序中的随机数生成。而 randomstate
则是一个独立的伪随机数生成器,它只会影响特定的变量。
rng = np.random.RandomState(0)
rng.rand(4)
# Out[1]: array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])
rng = np.random.RandomState(0)
rng.rand(4)
# Out[2]: array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])
其实它和 Seed
基本上是一样的,但有一点不同的是,我们不会把 randomstate 赋值给一个变量。
np.random.RandomState(0)
# Out[3]: <mtrand.RandomState at 0xddaa288>
np.random.rand(4)
# Out[4]: array([0.62395295, 0.1156184 , 0.31728548, 0.41482621])
np.random.RandomState(0)
# Out[5]: <mtrand.RandomState at 0xddaac38>
np.random.rand(4)
# Out[6]: array([0.86630916, 0.25045537, 0.48303426, 0.98555979])
后者和前者的区别在于,randomstate 只在特定的变量中有效。
0
np.random.RandomState() 是一个类,它提供了很多方法,这些方法是基于不同的概率分布的。
np.random.RandomState.seed() 是在初始化 RandomState() 时调用的。
10
random.seed 是一个用来填充 random.RandomState 容器的方法。
来自numpy文档:
numpy.random.seed(seed=None)
给随机数生成器设置种子。
这个方法在初始化RandomState时被调用。你也可以再次调用它来重新设置种子。想了解更多,可以查看RandomState的相关内容。
class numpy.random.RandomState
用于梅森旋转算法的伪随机数生成器的容器。
21
np.random.RandomState()
是用来创建一个随机数生成器的。它不会影响 np.random
中那些独立的函数,但你必须明确地使用它:
>>> rng = np.random.RandomState(42)
>>> rng.randn(4)
array([ 0.49671415, -0.1382643 , 0.64768854, 1.52302986])
>>> rng2 = np.random.RandomState(42)
>>> rng2.randn(4)
array([ 0.49671415, -0.1382643 , 0.64768854, 1.52302986])
116
如果你想设置一个种子,让调用 np.random...
的时候使用这个种子,可以用 np.random.seed
:
np.random.seed(1234)
np.random.uniform(0, 10, 5)
#array([ 1.9151945 , 6.22108771, 4.37727739, 7.85358584, 7.79975808])
np.random.rand(2,3)
#array([[ 0.27259261, 0.27646426, 0.80187218],
# [ 0.95813935, 0.87593263, 0.35781727]])
使用这个类可以避免影响全局的numpy状态:
r = np.random.RandomState(1234)
r.uniform(0, 10, 5)
#array([ 1.9151945 , 6.22108771, 4.37727739, 7.85358584, 7.79975808])
而且它会像之前一样保持状态:
r.rand(2,3)
#array([[ 0.27259261, 0.27646426, 0.80187218],
# [ 0.95813935, 0.87593263, 0.35781727]])
你可以通过以下方式查看这个“全局”类的状态:
np.random.get_state()
也可以查看你自己类实例的状态:
r.get_state()