我试图在区间[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]之外的值.
Knuth描述了TAOCP第二卷第122页的极性方法.该算法生成正态分布,均值= 0,标准差= 1.但您可以通过乘以所需的标准偏差并添加所需的平均值来进行调整.
您可能会发现将代码与C-FAQ中极坐标方法的另一种实现进行比较会很有趣.