rand() генерирует те же числа при использовании с fork()

#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));