Box-Muler算法
Box-Muller,一般是要得到服从正态分布的随机数,基本思想是先得到服从均匀分布的随机数再将服从均匀分布的随机数转变为服从正态分布。
Box-Muller 算法隐含的原理非常深奥,但结果却是相当简单。它一般是要得到服从正态分布的随机数,基本思想是先得到服从均匀分布的随机数再将服从均匀分布的随机数转变为服从正态分布。
如果在 (0,1] 值域内有两个独立的均匀分布的随机数字 U1 和 U2,
可以使用以下两个等式中的任一个算出一个正态分布的随机数字 Z:
Z0 = R * cos( θ )
或
Z1= R * sin( θ )
其中,
R = sqrt(-2 * ln(U1))
θ = 2 * π * U2
那么Z0和Z1是满足标准正态分布的独立随机数字。
由于R^2是二维正态分布(X,Y)的平方,所以它是有两个自由度的卡方分布,在两个自由度选取某个的特殊情况下,卡方分布和指数分布一致,所以上述R^2的方程式一个简单的产生指数随机数的方法。
正态值 Z0和Z1 有一个等于 0 的平均值和一个等于 1 的标准偏差,可使用以下等式将 Z 映射到一个平均值为 m、标准偏差为 sd 的统计量 X:
X = m + (Z * sd)
代码实现
float BoxMuler() {
float a = UnityEngine.Random.Range(0.01f, 1.01f);
float b = UnityEngine.Random.Range(0.01f, 1.01f);
float res = Mathf.Sqrt(-2 * Mathf.Log(a)) * Mathf.Cos(2 * Mathf.PI * b);
return res;
}