常態分佈在日常生活很常見,有時候在跑模擬的時候,某些情況可能需要自己產生輸入資料,
然而,C的隨機數是uniform distribution的,要產生常態分佈(normal distribution)該怎麼做呢?

聰明的數學家(我覺得數學家都是天才)已經幫我們找到了方法!!
詳見:Wiki - Normal distribution

方法很簡單,你必須先產生U,V兩組隨機變數,
他們必須是位於(0,1] (0<U,V<=1)區間,且必須是uniformly distributed,接著套入公式

Z = sqrt( -2 ln(U) ) * cos(2 * PI * V)    (cos也可以用sin)

Z所產生出來的值就會是標準常態分佈的~Gaussian(0,1),區間是在(-6,6),
我推不出來為什麼區間在這Orz,我數學很糟不要逼我>____<

接著,我們要把他延伸到任何樣子的常態分佈,根據標準常態分佈轉換的定理,
如果Z是標準常態分佈~Gaussian(0, 1),而X是~Gaussian(mean, std^2),
則X轉換為Z的公式為

Z = (X - mean) / std,因此要將Z擴展到所有情況只要做

X = Z * std + mean

所以,最後我們來看看C code應該怎麼寫吧!

#include <stdlib.h>
#include <math.h>
#include <stdio.h>

mean = XXX;
std = YYY;

for(i=0; i<NR_SAMPLES; i++)
{
    u = rand() / (double)RAND_MAX;
    v = rand() / (double)RAND_MAX;
    x = sqrt(-2 * log(u)) * cos(2 * M_PI * v) * std + mean;

    printf("%lf\n", x);
}

超簡單的!!XDDD
BTW, RAND_MAX和M_PI都是內定的常數,不需要自己定義哦!

學完隨機,也要學點程式怎麼寫比較有趣:DDD

關鍵字:C, normal distribution, gaussian distribution, generate value, 常態分佈

arrow
arrow
    全站熱搜

    koukaipan 發表在 痞客邦 留言(1) 人氣()