我在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. */
}
}
答案 0 :(得分:1)
每次要生成随机数时,都不应致电srand(time(NULL))
- 仅在main()
函数开头调用一次。
答案 1 :(得分:1)
你只需要为你的整个程序调用一次srand(),所以把它放在主函数的顶部或者程序早期方便的其他地方。
你看到相同数字对的原因很可能是因为你在紧密循环中调用了gaussian()函数,这样每次调用time()都会返回相同的值,从而重置随机数发电机到同一点;因此它给你相同的2个数字。
答案 2 :(得分:0)
#include <time.h>
//…
srand((unsigned)time(NULL));
//set a seed only once
//use rand()
但是,rand()总是生成伪随机数。