/ dev / urandom中的脾气暴躁的高斯人

问题描述 投票:1回答:1

我有一个需要使用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是所有随机性的唯一来源。

python numpy random gaussian normal-distribution
1个回答
0
投票

我遇到了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),或者甚至不重要。

© www.soinside.com 2019 - 2024. All rights reserved.