Скажем, у меня есть этот цикл:Можно ли посеять рандомизатор более одного раза, если это делается так?
for (i=0; i < 100; i++)
{
srand(time(NULL));
printf("%d\n", rand());
}
Если моя машина достаточно быстро, он должен печатать столько же 100 раз.
Но если я изменить это так:
for (i=0; i < 100; i++)
{
srand(time(NULL) + rand());
printf("%d\n", rand());
}
Затем он должен напечатать 100 различных номеров. Мой вопрос: есть ли что-то неправильное в посеве рандомизатора? Как насчет эффективности? Значительно снижает эффективность?
Ответ на вопрос, если я запустил рандомизатор в функции main()
один раз, достаточно ли для других функций (т. Е. Мне не нужно его снова сеять в другой функции, которая использует rand()
)?
EDIT
Существует причина, почему я, возможно, придется использовать этот способ (если, конечно, не лучший способ, который я не знаю). Скажем, у меня есть пользовательская библиотека с функцией, которая использует rand()
. Но эта функция не знает, был ли рандомизатор посеян до или нет. В этом случае я положил srand(time(NULL) + rand())
в эту функцию, чтобы убедиться, что рандомизатор посеян, даже если он раньше не был посеян.
Пример:
int main()
{
int i;
srand(time(NULL)); // Seeded here, but the print_rand() function does not know it
for (i=0; i < 100; i++)
{
print_rand();
}
return(0);
}
// Pretend this function is in a library
void print_rand()
{
srand(time(NULL) + rand()); // No guarantee if seeding was done before, so doing it here
printf("%d\n", rand());
}
РЕДАКТИРОВАТЬ 2
Я просто протестировали его с петель 1000000. Посев однажды взял 0.024s
и посев каждый раз принимал 4.972s
. Поэтому я думаю, что это значительно снижает производительность, если это большой цикл.
В большинстве случаев применение рандомизатора должно быть достаточным. В противном случае вам следует искать другие (более специализированные) рандомизаторы. – Kninnug
Если вы хотите что-то действительно случайное, вам не следует использовать 'rand()'/'srand()'. Вместо этого используйте Intel Secure Key (доступный на процессорах Intel с 2006 года). – ArtOfWarfare
Вопрос _why_ вы хотели бы засеять его более одного раза. Это похоже на вопрос: «Мне нужен красный дом. Можно ли красить мой дом красным 100 раз, а не только один раз?» – Lundin