Numpy Gaussian from /dev/urandom



我有一个应用程序,我需要numpy.random.normal但来自一个隐秘的PRNG源。Numpy似乎没有提供此选项。

我能找到的最好的是numpy.random.entropy.random_entropy但这只是 uint32 而且它有问题,使用大型数组,即使 urandom 是非阻塞的,您也会得到"运行时错误:无法从系统加密提供程序读取"......

但是,您可以这样做:np.frombuffer(bytearray(os.urandom(1000*1000*4)), dtype=np.uint32).astype(np.double).reshape(1000, 1000)

但我仍然面临着以某种方式将其转换为瓜斯语并且不搞砸任何事情的问题。

有人知道有解决方案吗?谷歌被来自/dev/urandom 的 numpy 播种毒害了,我不需要播种,我需要 urandom 是所有随机性的唯一来源。

我遇到了scipy.stats.rvs_ratio_uniforms并根据我的目的调整了他们的代码。它只比np.random.normal慢 3 倍,尽管从加密源采样的随机性是其两倍。

import numpy as np
import os

def uniform_0_1(size):
return np.frombuffer(bytearray(os.urandom(size*4)), dtype=np.uint32).astype(np.float) / 2**32
def normal(mu, sigma, size):
bmp = np.sqrt(2.0/np.exp(1.0)) # about 0.8577638849607068
size1d = tuple(np.atleast_1d(size))
N = np.prod(size1d)  # number of rvs needed, reshape upon return
x = np.zeros(N)
simulated = 0
while simulated < N:
k = N - simulated
a = uniform_0_1(size=k)
b = (2.0 * uniform_0_1(size=k) - 1.0) * bmp
accept = (b**2 <= - 4 * a**2 * np.log(a))
num_accept = np.sum(accept)
if num_accept > 0:
x[simulated : (simulated + num_accept)] = (b[accept] * sigma / a[accept]) + mu
simulated += num_accept

return np.reshape(x, size1d)

不过,有一个担忧numpy.random.random_sample:在半开区间 [0.0, 1.0] 中返回随机浮点数。

我不确定如何用我的uniform_0_1实现这种保证(从来不是 1.0(,或者它是否重要。

最新更新