高斯随机数问题
下面一段代码是在网上找的产生以均值为mean 方差为segma的正态分布的随机数的方法
#include "math.h"
#include "uniform.c"
double gauss2(double mean,double sigma,long int *s)
{double u1,u2,v1,v2,z,x,y;
double uniform(double ,double ,long int *);
do
{u1=uniform(0.0,1.0,s);
u2=uniform(0.0,1.0,s);
v1=2*u1-1.0;
v2=2*u2-1.0;
x=v1*v1+v2*v2;
}
while(x>1);
z=sqrt(-(2*log(x)/x))*v1;
y=mean+sigma*z;
return(y);
}
问题是,不知道该算法的正确性,也就是不太懂该算法的是怎么推到出来的??不知哪位好汉讲解讲解!!谢谢!!
[解决办法]
这是Box-Muller变换的极坐标形式。
Box-Muller变换是用来将均匀分布的随机变量给变换到高斯分布的。采用极坐标形式是为了能抑制浮点误差而数值稳定。