生成正態分布的數


java.util.Random里的nextGaussian(),生成的數值符合均值為0方差為1的高斯/正態分布,即符合標准正態分布。

產生數字的范圍:任何數都有可能,不過在0左右的數字較多。

產生N(a,b)的數:Math.sqrt(b)*random.nextGaussian()+a

jdk實現:  (Math中地方法都是調用StrictMath來實現的)

 private double nextNextGaussian;
 private boolean haveNextNextGaussian = false;
 public double nextGaussian() {
  if (haveNextNextGaussian) {
  haveNextNextGaussian = false;
  return nextNextGaussian;
  } else {
  double v1, v2, s;
  do {
  v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0
  v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0
  s = v1 * v1 + v2 * v2;
  } while (s >= 1 || s == 0);
  double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s);
  nextNextGaussian = v2 * multiplier;
  haveNextNextGaussian = true;
  return v1 * multiplier;
  }
 }

 

獨立同分布的中心極限定理:當樣本量很大時,獨立同分布的變量之和近似的服從正態分布.正態分布是一種自然分布,指的是大量的樣本數據有趨近於一個特定的值的趨勢,而且分布是均勻逼近的.

生成正態隨機數的方法有很多,jdk中實現的方案具有較快的速度。

 

附:java隨機數相關知識

http://lavasoft.blog.51cto.com/62575/113758/

http://blog.sina.com.cn/s/blog_4cbb6b0c0100080a.html

產生隨機數需要一個基值seed,缺省為系統時間。用相同種子建立的Random對象返回的偽隨機序列是相同的,即種子相同,依次產生出的數據是一樣的。

計算機產生隨機數不是真正的隨機數,而是一種模擬隨機數(偽隨機數)。是通過輸入一個種子數,然后通過對種子數進行計算產生一系列隨機數,這些隨機數是周期循環的。不同的算法有不同的循環周期。當然我們希望周期越長越好。相同的種子應該產生相同的隨機數序列。這就是為什么我們需要用時間函數設種子數的原因,避免產生相同的隨機數序列。純粹的毫無規律的隨機數用處不大。有用的是產生符合某種函數分布的隨機數。例如最常用的是產生符合正態分布的隨機數,因為在數值計算的時候,常常需要對隨機事件進行模擬並求解,例如,計算銀行窗口辦理業務的效率問題,因為顧客來、排隊、辦理業務整個過程符合正態分布,因此計算效率問題就需要產生符合正態分布的隨機數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM