熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

正態分布的隨機數發生器

2013-11-13 09:48:57  來源: .NET編程 

  主要參考《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;

  }

  }

  }


From:http://tw.wingwit.com/Article/program/net/201311/11655.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.