2013-05-30 6 views
0

Я пишу свой первый код в C. Проект представляет собой код молекулярной динамики, имитирующий частицы, прыгающие вокруг в бесконечно повторяющейся коробке (периодические граничные условия). До этого момента я загружал позиции частиц и скорости с заданными значениями. Настало время добавить некоторую (псевдо) случайность к моей симуляции. Я нашел следующую гауссовую функцию генерации случайных чисел в сети и после некоторых модификаций (исходный автор использовал drand48(), с которым я не мог работать) У меня есть функция gaussian(), возвращающая некоторые числа. На данный момент я не изменяю возвращаемые значения 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. */ 
    } 
} 
+1

Я уверен, что дюжина людей уже указала на вашу очевидную ошибку в помещении функции srand() внутри вашей функции. Если это то, что вам действительно нужно делать (а не просто упражнение), МНОГО быстрый способ вычисления нормальных вариаций называется алгоритмом Зиггурата. Мой общественный домен [ojrandlib] (http://github.com/lcrocker/ojrandlib) делает это. –

ответ

1

Вы не должны вызывать srand(time(NULL)) каждый раз, когда вы хотите, чтобы генерировать случайные числа - назовем это только один раз, в начале вашей main() функции.

+0

Отлично, это сработало красиво. Так очевидно. – Davis

0
#include <time.h> 
//… 
srand((unsigned)time(NULL)); 
//set a seed only once 
//use rand() 

Однако rand() всегда генерирует псевдослучайное число.

1

Вам нужно всего лишь вызвать srand() один раз для всей вашей программы, поэтому поставьте его рядом с верхней частью основной функции или где-нибудь еще в начале вашей программы.

Причина, по которой вы видите одни и те же пары чисел, скорее всего, потому что вы вызываете свою функцию gaussian() в замкнутом цикле, так что каждый вызов функции time() возвращает одно и то же значение и поэтому перезапускает случайное генератор чисел в одну и ту же точку; следовательно, он дает вам те же 2 числа.

Смежные вопросы