【问题标题】:The random number generator in numpynumpy 中的随机数生成器
【发布时间】:2015-04-22 18:35:16
【问题描述】:

我正在使用numpy.random.randn和numpy.random.rand来生成随机数。我对random.randn 和random.rand 之间的区别感到困惑?

【问题讨论】:

    标签: numpy ipython


    【解决方案1】:

    docs 中提到了两者的主要区别。链接到Doc rand 和Doc randn

    对于 numpy.rand,您会得到由均匀分布生成的随机值在 0 - 1

    但是对于 numpy.randn,您会得到从正态分布生成的随机值,均值为 0,方差为 1。

    只是一个小例子。

    >>> import numpy as np
    >>> np.random.rand(10)
    array([ 0.63067838,  0.61371053,  0.62025104,  0.42751699,  0.22862483,
            0.75287427,  0.90339087,  0.06643259,  0.17352284,  0.58213108])
    >>> np.random.randn(10)
    array([ 0.19972981, -0.35193746, -0.62164336,  2.22596365,  0.88984545,
           -0.28463902,  1.00123501,  1.76429108, -2.5511792 ,  0.09671888])
    >>> 
    

    如您所见,rand 为我提供了 0-1 内的值,

    而 randn 为我提供了 mean == 0 和 variance == 1

    的值

    为了进一步解释,让我生成一个足够大的样本:

    >>> a = np.random.rand(100)
    >>> b = np.random.randn(100)
    >>> np.mean(a)
    0.50570149531258946
    >>> np.mean(b)
    -0.010864958465191673
    >>>
    

    您可以看到 a 的平均值接近于使用 rand 生成的0.50。另一方面,b 的平均值接近于使用 randn

    生成的0.0

    【讨论】:

      【解决方案2】:

      您可以也通过百分比点函数 (ppf) 用于正态分布,随机变量分布 ~ N(0,1)。这是一种众所周知的方法,可以将任何均匀随机变量 (0,1) 投影到 ppf 上,以获得所需累积分布的随机变量。

      在 Python 中,我们可以将这个过程可视化如下:

      from numpy.random import rand
      import matplotlib.pyplot as plt
      from scipy.stats import norm
      
      u = rand(100000)   # uniformly distributed rvs
      z = norm.ppf(u)    # ~ N(0,1) rvs
      
      plt.hist(z,bins=100)
      plt.show()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 2019-06-24
        • 2016-12-16
        • 2020-08-23
        • 1970-01-01
        • 2018-12-31
        • 2020-01-11
        相关资源
        最近更新 更多