国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

正態分布的隨機數發生器 in C#

2024-07-21 02:27:03
字體:
來源:轉載
供稿:網友

box 和 muller 在 1958 年給出了由均勻分布的隨機變量生成正態分布的隨機變量的算法。設 u1, u2 是區間 (0, 1) 上均勻分布的隨機變量,且相互獨立。


主要參考《numerical recipes in c++ 2/e》p.292~p.294 和《simulation modeling and analysis 3/e》p.465~p.466。

box 和 muller 在 1958 年給出了由均勻分布的隨機變量生成正態分布的隨機變量的算法。設 u1, u2 是區間 (0, 1) 上均勻分布的隨機變量,且相互獨立。令

x1 = sqrt(-2*log(u1)) * cos(2*pi*u2);
x2 = sqrt(-2*log(u1)) * sin(2*pi*u2);

那么 x1, x2 服從 n(0,1) 分布,且相互獨立。等于說我們用兩個獨立的 u(0,1) 隨機數得到了兩個獨立的 n(0,1)隨機數。

marsaglia 和 bray 在 1964 年提出了一種改進算法,避免使用三角函數。以下的實現代碼用的就是這種改進算法。


//
// gaussian random number generator class
// ref. ``numerical recipes in c++ 2/e'', p.293 ~ p.294
//
  public class gaussianrng
  {
    int iset;
    double gset;
    random r1, r2;
   
    public gaussianrng()
    {
      r1 = new random(unchecked((int)datetime.now.ticks));
      r2 = new random(~unchecked((int)datetime.now.ticks));
      iset = 0;
    }
   
    public double next()
    {
      double fac, rsq, v1, v2;   
      if (iset == 0) {
        do {
          v1 = 2.0 * r1.nextdouble() - 1.0;
          v2 = 2.0 * r2.nextdouble() - 1.0;
          rsq = v1*v1 + v2*v2;
        } while (rsq >= 1.0 || rsq == 0.0);
       
        fac = math.sqrt(-2.0*math.log(rsq)/rsq);
        gset = v1*fac;
        iset = 1;
        return v2*fac;
      } else {
        iset = 0;
        return gset;
      }
    }
  }


 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 罗定市| 孙吴县| 丹阳市| 漾濞| 水城县| 柳州市| 英德市| 子洲县| 芮城县| 平阴县| 斗六市| 尼勒克县| 石屏县| 鸡泽县| 化隆| 宜昌市| 阿拉善盟| 恩施市| 肥乡县| 衡南县| 沧州市| 马尔康县| 新沂市| 青海省| 迁安市| 清丰县| 宣汉县| 阿勒泰市| 磴口县| 赣榆县| 岫岩| 泾川县| 栾川县| 陆河县| 苏尼特右旗| 广安市| 建昌县| 华容县| 遵化市| 临江市| 垣曲县|