上周一道面试题,给你一个0到1的均匀分布,如何近似地生成一个均值为0,标准差为1的标准正态分布。并且用python实现。
也就是说你只能用numpy.random.uniform()这个函数,然后通过自己的一些算法,得到numpy.random.normal()。
已经挂了,但求思路!
3个回答
这个面试的考点就是中心极限定理和均匀分布吧。一组随机变量的均值符合正态分布。
np.random.uniform()生成的是(0, 1)之间均匀分布的随机数, 2 * np.random.uniform() - 1生成的是(-1, 1)之间均匀分布的随机数。
一个常识是(a, b)的随机均匀分布变量的方差是(a - b)^2 / 12。含有n个样本的样本均值的方差是(a - b)^2 / 12 / n。
import numpy as np
normal_rv = 30 * np.mean(2 * np.random.uniform(size=300) - 1)
上面得到的normal_rv就是一个标准正态分布随机变量。
具体步骤是先产生300个(-1, 1)随机变量,它们的均值的标准差是1 / 30,要得到标准正态分布,所以最前面要乘以30.
让我来静静地装个X,题目要求是近似的正态,其实完全可以精确的正态。Box–Muller变换就能做到这一点。
假设$i.i.d.~X_1, X_2\sim U(0,1)$,也就是服从(0, 1)均匀分布,那么
$$Z=\sqrt{-2\text{ln}(X_1)}\cos(2\pi X_2)$$
就是服从$N(0,1)$标准正态分布的随机变量。上面那个式子就是Box-Muller变换。