电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

正态分布的随机数发生器


发布日期:2024/8/6
 

主要参考《Numerical Recipes in C++ /e》p~p 和《Simulation Modeling and Analysis /e》p~p

Box 和 Muller 在 年给出了由均匀分布的随机变量生成正态分布的随机变量的算法设 U U 是区间 ( ) 上均匀分布的随机变量且相互独立

X = sqrt(*log(U)) * cos(*PI*U);

X = sqrt(*log(U)) * sin(*PI*U);

那么 X X 服从 N() 分布且相互独立等于说我们用两个独立的 U() 随机数得到了两个独立的 N()随机数

Marsaglia 和 Bray 在 年提出了一种改进算法避免使用三角函数以下的实现代码用的就是这种改进算法

//

// Gaussian Random Number Generator class

// ref ``Numerical Recipes in C++ /e p ~ p

//

public class GaussianRNG

{

int iset;

double gset;

Random r r;

public GaussianRNG()

{

r = new Random(unchecked((int)DateTimeNowTicks));

r = new Random(~unchecked((int)DateTimeNowTicks));

iset = ;

}

public double Next()

{

double fac rsq v v;

if (iset == ) {

do {

v = * rNextDouble() ;

v = * rNextDouble() ;

rsq = v*v + v*v;

} while (rsq >= || rsq == );

fac = MathSqrt(*MathLog(rsq)/rsq);

gset = v*fac;

iset = ;

return v*fac;

} else {

iset = ;

return gset;

}

}

}

上一篇:最基本的Socket编程

下一篇:使用泛型实现单例提供者