#c
Вопрос:
Я пытаюсь генерировать случайные числа в определенном диапазоне. Я также использую в своей программе дочерние процессы.
Однако rand()
функция генерирует одно и то же число, скажем 550, в цикле for, даже если я произвел его рандомизацию с помощью srand()
Вот код для демонстрации:
int main() { int count = 5; int i; for (i = 0; i lt; count; i ) { pid_t pid = fork(); if (pid == 0) { // random number between 500 and 700 srand(time(NULL)); int random = rand() % 100 500; printf("%dn", random); exit(0); } else { wait(NULL); } } return 0; }
В чем проблема? Как я могу это исправить?
Любая помощь будет признательна.
Комментарии:
1. Что ж,
time(NULL)
вероятно, это придает одинаковую начальную ценность всем этим процессам, так как это происходит очень быстро. Добавьте к нему некоторое значение, специфичное для процесса (например,time(NULL) i
например)2. @EugeneSh. Я попробовал, но опять та же история…
3. Это работает на меня.
4. Я получаю
524 531 538 545 552
первый раз, потом571 578 585 592 599
в следующий раз5. Просто попробовал сам. Получение одинаковых номеров с вашим кодом и разных номеров с
srand(i time(NULL));
Ответ №1:
Все процессы, которые запускает ваша программа, создаются очень быстро, поэтому значение, возвращаемое вызовом time(NULL)
, одинаково для всех них. Он передается в качестве начального значения генератору псевдослучайных чисел, что позволяет ему генерировать одну и ту же последовательность псевдослучайных чисел для каждого процесса.
Чтобы получить разные числа в каждом процессе, вы должны убедиться, что каждый процесс получает уникальное начальное значение. Самый простой способ добиться этого-добавить счетчик i
к значению времени:
srand(i time(NULL));