如何访问 numpy 默认全局随机数生成器
How to access numpy default global random number generator
我需要创建一个 class,它将随机数生成器(即 numpy.random.RandomState
对象)作为参数。如果未指定此参数,我想将其分配给 numpy 在 运行 numpy.random.<random-method>
时使用的随机生成器。我如何访问这个全局生成器?目前我只是通过将模块对象分配为随机生成器来做到这一点(因为它们共享方法/鸭子类型)。然而,这会在 pickling(无法 pickle 模块对象)和深度复制时导致问题。我想在 numpy.random
后面使用 RandomState 对象
PS:我正在使用 python-3.4
numpy.random
imports * from numpy.random.mtrand
,这是一个用Cython编写的扩展模块。 source code shows that the global state is stored in the variable _rand
. This variable is not imported 进入 numpy.random
范围,但您可以直接从 mtrand 获取它。
import numpy as np
from numpy.random.mtrand import _rand as global_randstate
np.random.seed(42)
print(np.random.rand())
# 0.3745401188473625
np.random.RandomState().seed(42) # Different object, does not influence global state
print(np.random.rand())
# 0.9507143064099162
global_randstate.seed(42) # this changes the global state
print(np.random.rand())
# 0.3745401188473625
正如 kazemakase 所建议的那样,我们可以利用 module-level 像 numpy.random.random
这样的函数实际上是隐藏 numpy.random.RandomState
的方法这一事实,方法是拉动 __self__
直接来自其中一种方法:
numpy_default_rng = numpy.random.random.__self__
我不知道如何访问全局状态。但是,您可以使用 RandomState 对象并将其传递。它附有随机分布,因此您将它们称为方法。
示例:
import numpy as np
def computation(parameter, rs):
return parameter*np.sum(rs.uniform(size=5)-0.5)
my_state = np.random.RandomState(seed=3)
print(computation(3, my_state))
我需要创建一个 class,它将随机数生成器(即 numpy.random.RandomState
对象)作为参数。如果未指定此参数,我想将其分配给 numpy 在 运行 numpy.random.<random-method>
时使用的随机生成器。我如何访问这个全局生成器?目前我只是通过将模块对象分配为随机生成器来做到这一点(因为它们共享方法/鸭子类型)。然而,这会在 pickling(无法 pickle 模块对象)和深度复制时导致问题。我想在 numpy.random
PS:我正在使用 python-3.4
numpy.random
imports * from numpy.random.mtrand
,这是一个用Cython编写的扩展模块。 source code shows that the global state is stored in the variable _rand
. This variable is not imported 进入 numpy.random
范围,但您可以直接从 mtrand 获取它。
import numpy as np
from numpy.random.mtrand import _rand as global_randstate
np.random.seed(42)
print(np.random.rand())
# 0.3745401188473625
np.random.RandomState().seed(42) # Different object, does not influence global state
print(np.random.rand())
# 0.9507143064099162
global_randstate.seed(42) # this changes the global state
print(np.random.rand())
# 0.3745401188473625
正如 kazemakase 所建议的那样,我们可以利用 module-level 像 numpy.random.random
这样的函数实际上是隐藏 numpy.random.RandomState
的方法这一事实,方法是拉动 __self__
直接来自其中一种方法:
numpy_default_rng = numpy.random.random.__self__
我不知道如何访问全局状态。但是,您可以使用 RandomState 对象并将其传递。它附有随机分布,因此您将它们称为方法。
示例:
import numpy as np
def computation(parameter, rs):
return parameter*np.sum(rs.uniform(size=5)-0.5)
my_state = np.random.RandomState(seed=3)
print(computation(3, my_state))