高斯随机数发生器

7 c random taocp gaussian

我试图在区间[0,1]中实现高斯分布随机数发生器.

float rand_gauss (void) {
  float v1,v2,s;

  do {
    v1 = 2.0 * ((float) rand()/RAND_MAX) - 1;
    v2 = 2.0 * ((float) rand()/RAND_MAX) - 1;

    s = v1*v1 + v2*v2;
  } while ( s >= 1.0 );

  if (s == 0.0)
    return 0.0;
  else
    return (v1*sqrt(-2.0 * log(s) / s));
}
Run Code Online (Sandbox Code Playgroud)

这几乎是Knuth第二卷TAOCP第3版第122页中算法的直接实现.

问题是rand_gauss()有时返回区间[0,1]之外的值.

Mik*_*ll' 8

Knuth描述了TAOCP第二卷第122页的极性方法.该算法生成正态分布,均值= 0,标准差= 1.但您可以通过乘以所需的标准偏差并添加所需的平均值来进行调整.

您可能会发现将代码与C-FAQ中极坐标方法的另一种实现进行比较会很有趣.