Скажем, у меня есть этот цикл:
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()
)?
ИЗМЕНИТЬ
Есть причина, по которой мне может понадобиться использовать этот способ (если, конечно, нет лучшего способа, которого я не знаю). Скажем, у меня есть пользовательская библиотека с функцией, которая использует 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
. Поэтому я предполагаю, что это приводит к значительному снижению производительности, если это большой цикл.
rand()
/srand()
. Вместо этого используйте Intel Secure Key (доступно на процессорах Intel с 2006 г.). - person ArtOfWarfare   schedule 25.08.2015