python - Numpy 高斯来自/dev/urandom

标签 python numpy random gaussian normal-distribution

我有一个需要的应用程序 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)

但我仍然面临着如何将其转换为高斯分布而不搞砸任何事情的问题。

有人知道有解决办法吗? Google 被来自/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) 中的随机 float 。

我不确定如何用我的 Uniform_0_1 实现这一保证(绝不是 1.0),也不知道它是否重要。

关于python - Numpy 高斯来自/dev/urandom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59971737/

相关文章:

python - SLURM Python 脚本在循环中累积内存

python - 使用图像数据生成器评估 keras 模型

python - 使用 NumPy 查找数组中最大值的索引

javascript - 无法使用 javaScript 将图像显示在随机位置

random - Rust GSL 库总是为随机数生成器返回相同的数字

python - Sklearn 模型系数并预测 linear_model 中的不匹配

python 键入模块在 python 3.5 中缺少 Coroutine 类

python - 从 Numpy 中的 2 个向量形成矩阵,重复 1 个向量

python - 按体素打乱 4 维时间序列

arrays - 使用 Swift 获取报价及其作者