怎样优雅地产生一组符合正态分布的随机数

看到C#这个tag之前我想说std::normal_distribution
看到之后。。。好像CLR里还真没有,那自己搓一个吧!
我数学很鶸(跟 @霍姚远 比),我选择抄代码(并没有)
从LLVM的libcxx中,我们观察它的头文件中的std::normal_distribution实现:
template \u0026lt;class _RealType\u0026gt;template\u0026lt;class _URNG\u0026gt;_RealTypenormal_distribution\u0026lt;_RealType\u0026gt;::operator()(_URNG\u0026amp; __g, const param_type\u0026amp; __p){ result_type _Up; if (_V_hot_) { _V_hot_ = false; _Up = _V_; } else { uniform_real_distribution\u0026lt;result_type\u0026gt; _Uni(-1, 1); result_type __u; result_type __v; result_type __s; do { __u = _Uni(__g); __v = _Uni(__g); __s = __u * __u + __v * __v; } while (__s \u0026gt; 1 || __s == 0); result_type _Fp = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s); _V_ = __v * _Fp; _V_hot_ = true; _Up = __u * _Fp; } return _Up * __p.stddev() + __p.mean();}可以看出,这一实现当中,每次生成两个符合标准正态分布的随机数,它们来自在单位圆内均匀分布的二元随机变量 怎样优雅地产生一组符合正态分布的随机数
。我们将它记作 怎样优雅地产生一组符合正态分布的随机数
,那么 怎样优雅地产生一组符合正态分布的随机数
就是 【怎样优雅地产生一组符合正态分布的随机数】 怎样优雅地产生一组符合正态分布的随机数

于是 怎样优雅地产生一组符合正态分布的随机数
,两个符合正态分布的随机数则分别是 怎样优雅地产生一组符合正态分布的随机数
怎样优雅地产生一组符合正态分布的随机数

看到这想来去搓一个C#实现的正态分布随机数发生器已经不难了,我就不展示自己的代码有多丑了。
另外,数学大佬们请开始你们的表演;我是看不懂这玩意怎么就正态了,太菜。
编辑:根据 @Yanbing Zhao 私下里的提示,这个方法叫Box-Muller transform,有兴趣的可以了解一下。感谢计算物理A课程学生的指点(逃走

■网友
根据中心极限定理,你可以使用多个均匀分布叠加作为正态分布。一般来说十二个就够了。
■网友
正态分布是对某一固定的数据集来说的,你随便给几个数,我都能构建一个包含这几个数的正态分布数据集,而且可以构建无数个.也就是数,任何n个数都可以同时属于m个正态分布数据集。
■网友
对于任意分布,都可以采用取0-1均匀分布后,再进行一个累积概率映射的方式,即x映射为使累积概率(-∞,y)为x的y值
然而正态分布的概率密度函数似乎并不初等可积,因此也就不太好应用这一方法了
(简单使用还是查表吧)


    推荐阅读