我正在用 C 编写我的第一个代码。该项目是一个分子动力学代码,用于模拟粒子在无限重复框(周期性边界条件)中弹跳。到目前为止,我一直在用预设值加载粒子位置和速度。是时候为我的模拟添加一些(伪)随机性了。我在网上找到了以下高斯随机数生成函数,经过一些修改(原作者使用 drand48(),我无法使用),我让 gaussian() 函数返回了一些数字。现在我没有修改返回值以适应模拟;我只是想确保每次都能获得新的价值观。
我知道我需要为 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. */
}
}