numpy中的随机数生成器

The random number generator in numpy

我正在使用 numpy.random.randnnumpy.random.rand 来生成随机数。我对 random.randnrandom.rand?

之间的区别感到困惑

两者的主要区别在docs中提到。链接到 Doc rand and 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[=58 范围内 =],

randn 给我的值是 mean == 0variance == 1

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

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

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

您可以获得转换rand数字到 randn Python 中的数字通过应用 百分点函数 (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()