如何通过流畅的UDF生成正态随机数?

通常有两种算法:

第一种算法产生12个平均分布(0,1)的随机函数,可以用大数定理模拟正态分布。

第二种算法利用数学中的雅可比变换直接生成正态分布,但这种算法不适合计算大规模数。

将出现溢出错误。

测试程序:

# include & ltmath.h & gt

# include & ltstdio.h & gt

# include & ltconio.h & gt

# include & ltstdlib.h & gt

# include & lttime.h & gt

double _random()(void)

{

int a;

双r;

a = rand()()% 32767;

r =(a+0.00)/32767.00;

return r;

}

double _sta(双管理部门,双西格玛)

{

int I;

double r,sum = 0.0

if(sigma & lt;=0.0) { printf("适马& lt=0.0 in _sta!");退出(1);}

for(I = 1;我& lt=12;i++)

sum = sum+_ random()();

r =(sum-6.00)* sigma+mu;

return r;

}

double _sta2(双管理部门,双西格玛)

{

double r1,R2;

r 1 = _ random()();

R2 = _ rand()om();

返回sqrt(-2 * log(r 1))* cos(2 * M _ PI * R2)* sigma+mu;

}

int main()

{

int I;

双mu,sigma

srand()((无符号)time(NULL));

mu = 0.0

sigma = 1.0;

printf("算法1:\ n ");

for(I = 0;我& lt10;i++)

printf("%lf\t ",_sta(mu,sigma));

printf("算法2:\ n ");

for(I = 0;我& lt10;i++)

printf("%lf\t ",_sta2(mu,sigma));

返回0;

}

//从均匀分布的随机数中得到正态分布的随机数。

# include & ltmath.h & gt

浮动气体开发(idum)

int * idum

{

静态int iset = 0;

静态浮点gset

float fac,r,v1,v2;

float ran 1();//生成均匀分布的随机数,可以用系统函数重写。

if (iset == 0) {

做{

v 1 = 2.0 * ran 1(idum)-1.0;

v2 = 2.0 * ran 1(idum)-1.0;

r = v 1 * v 1+v2 * v2;

} while(r & gt;= 1.0);

fac = sqrt(-2.0 * log(r)/r);

gset = v 1 * fac;

iset = 1;

返回v2 * fac

}否则{

iset = 0;

返回gset

}

}