返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的 double
值,其平均值是 0.0
,标准差是 1.0
。
nextgaussian
的常规协定是,伪随机地生成并返回一个 double
值,该值从(大致)具有平均值 0.0
和标准差 1.0
的标准正态分布中选择。
random
类按以下这种线程安全的方式实现 nextgaussian
方法:
private double nextnextgaussian;
private boolean havenextnextgaussian = false;
public double nextgaussian() {
if (havenextnextgaussian) {
havenextnextgaussian = false;
return nextnextgaussian;
} else {
double v1, v2, s;
do {
v1 = 2 * nextdouble() - 1; // between -1.0 and 1.0
v2 = 2 * nextdouble() - 1; // between -1.0 and 1.0
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;
}
}
这使用了 g. e. p. box、m. e. muller 和 g. marsaglia 的极坐标法 (polar method),该方法在 donald e. knuth 的 the art of computer programming, volume 3:seminumerical algorithms 的第 3.4.1 节,小节 c,算法 p 中进行了描述。注意,它只需调用一次 strictmath.log
和调用一次 strictmath.sqrt
> 就可以生成两个独立的值。
- 返回:
- 下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的
double
值,其平均值是 0.0
,标准差是 1.0
。