一、为什么需要服从正态分布的随机函数
一般我们经常使用的随机数函数 Math.random() 产生的是服从均匀分布的随机数,能够模拟等概率出现的情况,例如 扔一个骰子,1到6点的概率应该相等,但现实生活中更多的随机现象是符合正态分布的,例如20岁成年人的体重分布等。
假如我们在制作一个游戏,要随机设定许许多多 NPC 的身高,如果还用Math.random(),生成从140 到 220 之间的数字,就会发现每个身高段的人数是一样多的,这是比较无趣的,这样的世界也与我们习惯不同,现实应该是特别高和特别矮的都很少,处于中间的人数最多,这就要求随机函数符合正态分布。
二、正态分布复习
图片来自:http://zh.wikipedia.org/zh-cn/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83
具体性质也请查阅上面链接,描述正态分布的主要特征是均值和方差,如上图,最左的倒钟形图的均值为-2, 其余为0 ;
方差越大,钟形越扁平,方差越小越陡;
- 密度函数图像关于均值对称。
- 在x=μ±σ处,曲线有拐点。
- 函数曲线下68.26%的面积在平均数左右的一个标准差σ的区间内。
- 95.44%的面积在平均数左右两个标准差2σ的区间内。
- 99.74%的面积在平均数左右三个标准差3σ的区间内。
当均值为0, 方差为 1 时称为标准正态分布;
三、由均匀分布经 “Box-Muller法” 转换为正态分布
通过查阅文献可知(请参见:http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform),有一个称为 Box-Muller (1958) 转换的算法能够将两个在区间