C C 生成高斯分布隨機數

2021-07-30 06:26:51 字數 1792 閱讀 6249

產生正態分佈或高斯分布的三種方法: 

1. 運用中心極限定理(大數定理)

1 #include 

2 #include

3 4 #define nsum 25

5 6 double gaussrand()

7 14

15 x -= nsum / 2.0;

16 x /= sqrt(nsum / 12.0);

17 18 return x;

19 }

2.利用有box 和 muller 提供的,在 knuth的網上討論過的方法 (比較常用的方法)

box-muller,一般是要得到服從正態分佈的隨機數,

基本思想: 先得到服從均勻分布的隨機數;  然後再將服從均勻分布的隨機數轉變為服從正態分佈.

box-muller 是產生隨機數的一種方法。box-muller 演算法隱含的原理非常深奧,但結果卻是相當簡單。

如果在 (0,1] 值域內有兩個一致的隨機數字 u1 和 u2,

可以使用以下兩個等式中的任乙個算出乙個正態分佈的隨機數字 z:

z = r * cos( θ ) 或 z = r * sin( θ )

其中, r = sqrt(-2 * ln(u2)), θ = 2 * π * u1

正態值 z 有乙個等於 0 的平均值和乙個等於 1 的標準偏差,可使用以下等式將 z 對映到乙個平均值為 m、標準偏差為 sd 的統計量 x:

x = m + (z * sd)

c**: (計算機程式設計中, log函式==ln()函式,以e為底的自然對數,  log10 才是以10為底的函式)

1 #include 2 #include 3 #define pi 3.141592654double 

doublegaussrand( )4

15 else

16

19 20 phase = 1 - phase;

21 retrn z;

22 }

c++**:  

1 #include 2 #include 3 #include 4 double generategaussiannoise(double mu, double sigma)

5 22 while ( u1 <= epsilon );

23 24 z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2);

25 z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2);

26 return z0 * sigma + mu;

27 }

3 使用最初有marsaglia 提供的方法

1 #include 2 #include 3 double gaussrand()

4 while( s >= 1 || s ==0)

19

20 x = v1 * sqrt (-2 * log(s) / s);

21 }

22 else

23

26 27 phase = 1 - phase;

28 return x;

29 }

參考: 

C語言產生標準正態分佈或高斯分布隨機數

c語言 產生標準正態分佈或高斯分布 隨機數 產生正態分佈或高斯分布的三種方法 1.運用中心極限定理 大數定理 1 include 2 include 34 define nsum 2556 double gaussrand 714 15 x nsum 2.0 16 x sqrt nsum 12.0 ...

C語言 產生標準正態分佈或高斯分布 隨機數

c語言 產生標準正態分佈或高斯分布 隨機數 產生正態分佈或高斯分布的三種方法 1.運用中心極限定理 大數定理 1 include 2 include 3 4 define nsum 25 5 6 double gaussrand 7 14 15 x nsum 2.0 16 x sqrt nsum 1...

C C 生成隨機數

01 include 02 include 03 04intmain intargc,char argv 05 10return0 11 01 02上述方法產生隨機數每次不同,但每次執行時產生的順序是相同的。原因是每次的種子都相同,所以會產生相同的隨機數列。一般使用時間作為種子保證每次的種子都不同。...