2013-05-30 29 views
0

我正在用C編寫我的第一個代碼。該項目是一個模擬粒子在無限重複框中週期性跳動的分子動力學代碼(週期性邊界條件)。到目前爲止,我一直在用預先設定的值加載粒子位置和速度。是時候爲我的模擬添加一些(僞)隨機性了。我在網上發現了下面的高斯隨機數生成函數,並在一些修改後(原作者使用drand48(),我無法工作)我有高斯函數返回一些數字。目前,我並沒有將模擬返回的值修改爲jive;我只是想確保每次都獲得新的價值。來自高斯隨機數發生器的返回值

據我所知,我需要納入rand()的種子,如srand(time(NULL))。 當srand(time(NULL))被註釋掉時,每次運行模擬時我都會得到相同的20個隨機數,但是當包含語句時,我會得到相同的一對隨機數10次。我如何正確地初始化rand()的種子?

/* function for gaussian random variables */ 
double gaussian() 
{ 
    static int have = 0; 
    static double x2; 
    double fac, y1, y2, x1; 

    if (have == 1) /* already one available ? */ 
    { 
     have = 0; 
     return x2; 
    } 
    else 
    { 
     /* generate a pair of random variables */ 
     /* srand(time(NULL)); */ 
     y1 = (double)rand()/RAND_MAX ; 
     y2 = (double)rand()/RAND_MAX ; 
     fac = sqrt(-2*log(y1)); 
     have = 1; 
     x1 = fac*sin(2*M_PI*y2); /* x1 and x2 are now gaussian */ 
     x2 = fac*cos(2*M_PI*y2); /* so store one */ 
     return x1;    /* and return the other. */ 
    } 
} 
+1

我敢肯定,有十幾個人已經指出了將srand()放入函數中的明顯錯誤。如果這是你真正需要做的事(而不只是一個練習),計算正態變量的更快的方法就是Ziggurat算法。我的公共領域[ojrandlib](http://github.com/lcrocker/ojrandlib)就是這樣做的。 –

回答

1

你不應該叫srand(time(NULL))要生成隨機數每一次 - 只有一次調用它,在你main()函數的開始。

+0

非常好,這工作很好。太明顯了。 – Davis

0
#include <time.h> 
//… 
srand((unsigned)time(NULL)); 
//set a seed only once 
//use rand() 

但是,rand()總是生成僞隨機數。

1

您只需要爲整個程序調用一次srand(),以便將其放在主函數的頂部或程序的早期部分的其他位置。

您看到相同數字對的原因很可能是因爲您在緊密循環中調用了gaussian()函數,因此每次調用time()都會返回相同的值並因此重置隨機數號碼發生器到同一點;因此它給你相同的2個數字。