我有一个需要使用numpy.random.normal
的应用程序,但该应用程序来自低温PRNG来源。 Numpy似乎没有提供此选项。
[我能找到的最好的是numpy.random.entropy.random_entropy
,但这只是uint32,而且它有很多问题,即使urandom没有阻塞,使用大数组也会出现“ RuntimeError:无法从系统密码提供程序读取...
但是您可以这样做:np.frombuffer(bytearray(os.urandom(1000*1000*4)), dtype=np.uint32).astype(np.double).reshape(1000, 1000)
但是我仍然面临以某种方式将其转换为Guassian而不是搞砸的问题。
有人知道有解决方案吗? / dev / urandom的numpy播种使Google受到毒害,我不需要播种,我需要urandom是所有随机性的唯一来源。
我遇到了scipy.stats.rvs_ratio_uniforms
,并为我的目的改编了他们的代码:
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
i = 1
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
i += 1
#print("[dbg] round " + str(i))
return np.reshape(x, size1d)
但是,numpy.random.random_sample
令人担心:以半开间隔[0.0,1.0)返回随机浮点数。
我不确定如何通过我的制服_0_1实现此保证(从不保证1.0),或者甚至不重要。