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