C++: Инициализация srand?

Как лучше всего инициализировать srand в С++?


Я всегда использовал srand( time(NULL) ), но этот метод не работает когда программа запускается много раз в одну и ту же секунду.


Для примера, если взять такую программу
int main(int argc, char** argv){<br/>
 srand( time(0) );<br/>
 printf(&quot;%d\n&quot;, rand()%1000000);<br/>
}<br/>



и запустить скрипт
g++ gen.cpp -o gen<br/>
<br/>
for cnt in {1..100}<br/>
do<br/>
 ./gen<br/>
done<br/>



можно увидеть что почти все значения одинаковые.


Как лучше всего генерировать случайные числа в С++ если программа запускается 40-50 раз в секунду?
  • Вопрос задан
  • 11556 просмотров
Решения вопроса 1
@yeputons
Еще варианты:
1. На Linux можно считать первые четыре байта из /dev/urandom
2. На x86/x64 можно воспользоваться командой 'rdtsc' — возвращает количество тактов процессора с старта системы. Код для GCC:
long long x;
asm("rdtsc" : "=A"(x));
srand(x);

Так и делаю, когда пишу генераторы тестов к задачам для стресс-тестирования.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Damaskus
@Damaskus
WinApi: GetTickCount() — количество миллисекунд, со времени старта системы.
Ответ написан
Комментировать
ertaquo
@ertaquo
Может так?
srand(clock());
Ответ написан
Eol
@Eol
Вариант — использовать gettimeofday(). Он вернет struct timeval, из которой можно достать микросекунды :)
POSIX-2008 помечает gettimeofday как устаревший, вместо него можно аналогично использовать clock_gettime().
PS. Это про POSIX-системы, на винде не факт что есть.
PPS. А причём тут C++?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы