0

我正在用 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. */
    }
}
4

3 回答 3

1

您不应该在srand(time(NULL))每次想要生成随机数时都调用它 - 在main()函数开始时只调用一次。

于 2013-05-30T02:06:06.653 回答
1

你只需要为你的整个程序调用一次 srand() ,所以把它放在你的 main 函数的顶部附近,或者在你程序的早期部分方便的地方。

您看到相同数字对的原因很可能是因为您在紧密循环中调用 gaussian() 函数,这样每次调用 time() 都返回相同的值,因此将随机数生成器重置为同一点;因此它为您提供了相同的 2 个数字。

于 2013-05-30T02:10:34.280 回答
0
#include <time.h>
//…
srand((unsigned)time(NULL));
//set a seed only once
//use rand()

但是,rand() 总是生成伪随机数。

于 2013-05-30T02:07:06.767 回答