从高斯随机数发生器返回的值

时间:2013-05-30 01:54:34

标签: c random gaussian

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

3 个答案:

答案 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()总是生成伪随机数。