Лучший ответ - использовать материал Boost для случайных чисел. Или, если у вас есть доступ к C ++ 11, используйте заголовок <random>
.
Но если мы говорим о rand()
и srand()
Лучше всего просто использовать time()
:
int main()
{
srand(time(NULL));
...
}
Обязательно делайте это в начале вашей программы, а не каждый раз, когда вы звоните rand()
!
Каждый раз, когда вы запускаете, time () возвращает уникальное значение (если вы не запускаете приложение несколько раз в секунду). В 32-битных системах это будет повторяться каждые 60 лет или около того.
Я знаю, вы не думаете, что время достаточно уникально, но мне трудно в это поверить. Но я, как известно, был неправ.
Если вы запускаете много копий своего приложения одновременно, вы можете использовать таймер с более высоким разрешением. Но затем вы рискуете сократить период времени, прежде чем значение повторится.
ОК, так что если вы действительно думаете, что запускаете несколько приложений в секунду.
Затем используйте более точное зерно на таймере.
int main()
{
struct timeval time;
gettimeofday(&time,NULL);
// microsecond has 1 000 000
// Assuming you did not need quite that accuracy
// Also do not assume the system clock has that accuracy.
srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
// The trouble here is that the seed will repeat every
// 24 days or so.
// If you use 100 (rather than 1000) the seed repeats every 248 days.
// Do not make the MISTAKE of using just the tv_usec
// This will mean your seed repeats every second.
}