1. 如何生成高斯分布?
在java8中的實現(xiàn)采用了 Marsaglia polar method (Box–Muller的一種形式), 具體理論如下:
- 隨機變量
服從
的均勻分布
- 計算
- 如果
, 接著計算, 否則轉(zhuǎn)4
-
,
獨立,并且都符合高斯正態(tài)分布
代碼片段:
// Random.java
private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53)
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27)) * DOUBLE_UNIT;
}
private double nextNextGaussian;
private boolean haveNextNextGaussian = false;
synchronized public double nextGaussian() {
// See Knuth, ACP, Section 3.4.1 Algorithm C.
if (haveNextNextGaussian) {
haveNextNextGaussian = false;
return nextNextGaussian;
} else {
double v1, v2, s;
do {
v1 = 2 * nextDouble() - 1; // between -1 and 1
v2 = 2 * nextDouble() - 1; // between -1 and 1
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1 * multiplier;
}
}
之所以是這種方法大致的來源是:
單位圓 --> 均勻分布 --> 指數(shù)分布 --> 自由度為2的卡方分布 --> 反推出2個隨機變量的表達式
2. Box–Muller 變換
Box–Muller transform 可以分為2種形式:
1. 基礎(chǔ)形式
服從
的均勻分布,則:
, 獨立并且服從標準正態(tài)分布
2. 極坐標形式
BoxMullerTransformUsingPolarCoordinates
服從
的均勻分布,
:
獨立并且服從標準正態(tài)分布
這種方法避免了 的計算
, 當
去掉算得的
, 所以也是一種 rejection sampling
ref: