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

Posted

技术标签:

【中文标题】np.random.seed() 和 np.random.RandomState() 之间的区别【英文标题】:Difference between np.random.seed() and np.random.RandomState() 【发布时间】:2014-05-24 12:52:45 【问题描述】:

我知道要播种 numpy.random 的随机性并能够重现它,我应该:

import numpy as np
np.random.seed(1234)

但是什么 np.random.RandomState() 怎么办?

【问题讨论】:

另见:***.com/q/37224116/562769 这是一个非常好的讨论:***.com/questions/5836335/… 你真的必须在 cmets 中跋涉并注意 Robert Kern 是一个 numpy 开发者 【参考方案1】:

random.seed 是一种填充random.RandomState 容器的方法。

来自 numpy 文档:

numpy.random.seed(seed=None)

播种生成器。

该方法在 RandomState 初始化时被调用。可以再次调用它来重新播种生成器。有关详细信息,请参阅 RandomState。

class numpy.random.RandomState

Mersenne Twister 伪随机数生成器的容器。

【讨论】:

但如果我调用 RandomState(1234) 并使用 random.uniform() 创建一个数字,则结果不可重现。 RandomState 之类的容器是用来做什么的? @eran 你知道Mersenne twister 和Uniform distribution 不是一回事吗?请阅读this 以了解更多关于random.RandomState 的信息。 @eran,实际上是因为您正在创建该类的另一个实例。请参阅我的答案以了解如何使用它。 谢谢!我现在明白了。很直接。该文档只是缺少一个适当的示例。或者我有一个盲点......【参考方案2】:

如果要设置调用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()

【讨论】:

你的回答很有道理。但是文档如何不令人困惑? This method is called when RandomState is initialized. It can be called again to re-seed the generator. 它没有说明当我调用此方法时,我只影响一个全局实例(或其他),而不影响任何其他 RandomState 实例。 是的,我同意..numpy.random 模块文档应该清楚地说明该模块是使用RandomState 的有效实例初始化的。但是我找不到任何关于模块本身的文档。【参考方案3】:

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])

【讨论】:

对独立功能有什么影响?我认为它像我的回答一样创建了一个独立的实例。 @askewchan:错字,我的意思是它没有有任何效果。【参考方案4】:

np.random.RandomState() - 一个基于不同概率分布提供多种方法的类。 np.random.RandomState.seed() - 在 RandomState() 初始化时调用。

【讨论】:

欢迎来到 SO!感谢您花时间回答这个问题。您能否提供有关您的解决方案的更多详细信息?例如,为什么您的解决方案比公认的答案更好?此外,这个问题是在 6 年前提出并回答的。回答时请务必查看原始问题的日期。请阅读How to Answer。【参考方案5】:

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])

后者与前者不同。这意味着随机状态仅在特定变量内有效。

【讨论】:

以上是关于np.random.seed() 和 np.random.RandomState() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

np.random.seed()

numpy:np.random.seed()

numpy.random.seed(0) 做啥?

Numpy 函数总结 (不断更新)

python下关于np.random.choice()的问题

NumPy基础:随机数生成