简体   繁体   中英

How to access numpy default global random number generator

I need to create a class which takes in a random number generator (ie a numpy.random.RandomState object) as a parameter. In the case this argument is not specified, I would like to assign it to the random generator that numpy uses when we run numpy.random.<random-method> . How do I access this global generator? Currently I am doing this by just assigning the module object as the random generator (since they share methods / duck typing). However this causes issues when pickling (unable to pickle module object) and deep-copying. I would like to use the RandomState object behind numpy.random

PS: I'm using python-3.4

numpy.random imports * from numpy.random.mtrand , which is an extension module written in Cython. The source code shows that the global state is stored in the variable _rand . This variable is not imported into the numpy.random scope but you can get it directly from 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建议的内容之外,我们还可以利用numpy.random.random等模块级函数实际上是隐藏numpy.random.RandomState的方法,直接从其中一个方法中拉出__self__

numpy_default_rng = numpy.random.random.__self__

I don't know how to access the global state. However, you can use a RandomState object and pass it along. Random distributions are attached to it, so you call them as methods.

Example:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM