gcc 4.4.4 c89
Я использую код ниже. Однако я продолжаю получать то же число:
size_t i = 0;
for(i = 0; i < 3; i++) {
/* Initialize random number */
srand((unsigned int)time(NULL));
/* Added random number (simulate seconds) */
add((rand() % 30) + 1);
}
Я хотел бы добраться от 0 до 30, возвратился. Однако в прошлый раз, когда я выполнил это, я добрался 17 три раза.
Большое спасибо,
Вы заполняете внутри цикла (с тем же значением из-за того, как быстро цикл будет выполняться), что приводит к тому, что сгенерированные случайные числа будут одинаковыми для каждого время.
Вам нужно переместить начальную функцию за пределы цикла:
/* Initialize random number */
srand((unsigned int)time(NULL));
for(i = 0; i < 3; i++) {
/* Added random number (simulate seconds) */
add((rand() % 30) + 1);
}
Вам нужно вызвать srand только один раз, в начале вашей программы.
srand
инициализирует генератор псевдослучайных чисел, используя время в секундах. Если вы инициализируете его определенным числом, вы всегда будете получать одну и ту же последовательность чисел. Вот почему вы обычно хотите инициализировать его вначале, используя время (чтобы начальное число было другим каждый раз, когда вы запускаете программу), а затем использовать только rand
для генерации чисел, которые кажутся случайными.
В вашем случае время не меняется от итерации к итерации, поскольку ее разрешение составляет всего 1 секунду, поэтому вы всегда получаете первое число псевдослучайной последовательности, которое всегда одно и то же.
Вам нужно сделать srand ( (unsigned int) time (NULL))
только один раз перед циклом.
Начальное значение генератора псевдослучайных чисел должно вызываться только один раз вне цикла. Использование времени как семени - это хорошо. Однако есть возможность получить такое же случайное число.
Вполне возможно, что 3 раза по 17 все еще абсолютно случайны.
Существует примерно 1 к 10 шанс получить два одинаковых числа при использовании диапазона от 1 до 30 и трех вариантов. (это связано с проблемой дня рождения )
Теперь, получение трех одинаковых результатов имеет вероятность 1 к 900 при использовании того же диапазона.
Возможно, вы захотите прочитать дополнительную информацию на странице анализа на сайте random.org
Я предлагаю также использовать системный вызов gettimeofday () для получения начального числа, которое будет использоваться для подачи srand ().
Что-то вроде
struct timeval tv;
...
gettimeofday(&tv, NULL);
srand(tv.tv_usec);
...
Этот подход может добавить больше энтропии в ваш код генерации псевдо-чисел. ИМХО конечно
Ciao ciao