/**
 * 用极坐标法(polar method)生成一个呈高斯分布的伪随机数。
 * 
 * 这使用了 G. E. P. Box、M. E. Muller 和 G. Marsaglia 的极坐标法,
 * 该方法在 Donald E. Knuth 的 The Art of Computer Programming, 
 * Volume 3:Seminumerical Algorithms 的第 3.4.1 节,小节 C,算法 P 中进行了描述。
 * 注意,它只需调用一次 Math.log 和调用一次 Math.sqrt 就可以生成两个独立的值
 * 
 * @param mu 平均值μ
 * @param sigma 标准差σ^2
 * 
 * @return 伪随机数。
 */
public static function getGaussian2(mu:Number = 0, sigma:Number = 1):Number {
 if (haveNextNextGaussian) {
  haveNextNextGaussian = false;
   return nextNextGaussian;
 } else {
  var v1:Number, v2:Number, s:Number;
  do {
   v1 = 2 * Math.random() - 1; // between -1.0 and 1.0
   v2 = 2 * Math.random() - 1; // between -1.0 and 1.0
    s = v1 * v1 + v2 * v2;
  } while (s >= 1 || s == 0);
  var multiplier:Number = Math.sqrt(-2 * Math.log(s)/s);
  nextNextGaussian = v2 * multiplier;
  haveNextNextGaussian = true;
  return v1*multiplier*sigma + mu;
 }
}
private static var nextNextGaussian:Number;
private static var haveNextNextGaussian:Boolean = false;本文链接:https://assnippets.blogspot.com/2008/01/as3_24.html转载请注明出处。
相关文章:
0评论:
发表评论