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