np.random.seed()和np.random.RandomState()的区别

116 投票
6 回答
106839 浏览
提问于 2025-04-18 02:14

我知道为了让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()

撰写回答