Предотвращение повторной генерации начального числа с помощью srand()

У меня типичная ситуация, когда мне нужно сгенерировать пакет случайных чисел. Я использовал цикл, который генерирует 100 случайных чисел при каждом проходе:

for(int i=0; i<npasses; i++)
{
   srand(time(NULL)); //Initialize seed

   for(int j=0; j<100; j++)
      printf("%d ", rand()%10);

   printf("\n"); //New line after 100 numbers
}

Теперь внутренний цикл выполняется менее чем за миллисекунду. В результате значение time() не меняется. Это повторно инициализирует начальное число (srand()) до того же значения, и мои случайные числа ПОВТОРЯЮТСЯ.

Может ли кто-нибудь предложить обходной путь/исправление.


person Ashis Kumar Sahoo    schedule 16.05.2013    source источник


Ответы (4)


Установите семя один раз перед циклом.

person jabbink    schedule 16.05.2013

Держите srand подальше:

srand(time(NULL)); //Initialize seed
for(int i=0; i<npasses; i++)
{
   for(int j=0; j<100; j++)
      printf("%d ", rand()%10);

   printf("\n"); //New line after 100 numbers
}
person David Ranieri    schedule 16.05.2013

попробуй это

srand(clock()); //Initialize seed
person BLUEPIXY    schedule 16.05.2013
comment
Я думаю, что это вызовет ту же проблему? - person Ashis Kumar Sahoo; 16.05.2013
comment
@AshisKumarSahoo Я думаю, что это не должно быть таким же. - person BLUEPIXY; 16.05.2013
comment
Почему нет? Системное время не может быть откалибровано ниже миллисекунды. time() уже делает это. Я не думаю, что clock() работает иначе. Просьба уточнить. - person Ashis Kumar Sahoo; 16.05.2013
comment
@AshisKumarSahoo Возвращаемое значение () time находится в секундах, но значение, возвращаемое часами (), обычно составляет микросекунды с момента запуска системы. - person BLUEPIXY; 16.05.2013
comment
@BLUEPIXY.. Я так не думаю. Процитируйте какую-нибудь ссылку. - person Ashis Kumar Sahoo; 16.05.2013
comment
давайте продолжим это обсуждение в чате - person Ashis Kumar Sahoo; 16.05.2013
comment
Я не хочу тратить время на это - person BLUEPIXY; 16.05.2013
comment
@BLUEPIXY.. Мне жаль это говорить, но, пожалуйста, пересмотрите свои факты. Такты часов составляют миллисекунды. Это связано с тем, что CLOCKS_PER_SEC (или clock_t) имеет типичное значение около 1000. По сути, это означает, что этот таймер обновляется каждую миллисекунду. И это противоречит цели моего использования. В любом случае, я нашел ответ. Спасибо за ответ. - person Ashis Kumar Sahoo; 16.05.2013
comment
Отличается системой обработки. Во-первых, если вы это определите после попытки на самом деле. Я сказал "try this". - person BLUEPIXY; 16.05.2013
comment
см., потому что есть комментарий к C A Reference Manual 5th edition. - person BLUEPIXY; 17.05.2013

Вы можете использовать генератор случайных чисел, чтобы сгенерировать новое семя.

Например:

srand((unsigned int)rand());

И используйте srand(time(NULL)) только один раз перед циклом. Но, как было предложено в другом ответе, вы также можете отбросить все srand внутри цикла.

person Bryan Olivier    schedule 16.05.2013
comment
Это не только не нужно, это опасно. Большинство генераторов теперь имеют более длинные, чем 32-битные периоды, и многократное повторное заполнение с 32-битным начальным числом ограничивает использование только первых нескольких чисел из ограниченного числа последовательностей. Вызовите srand() один раз и только один раз в начале вашей программы. - person Lee Daniel Crocker; 16.05.2013