2015-06-11 4 views
3

Я прошу посмотреть, есть ли способ увеличить скорость, функция srand(time(NULL)); «освежает»? Я понимаю, что srand() производит новое семя в зависимости от времени (так один раз в секунду), но я ищу альтернативу srand(), который может обновляться чаще, чем 1 секунда.Можно ли увеличить скорость обновления srand (time (NULL)) в C?

Когда я запускаю свою программу, он дает результат, который предполагается, но семя остается неизменным по существу секундой, поэтому, если программа запускается несколько раз в секунду, результат остается неизменным.

Извините за такой простой вопрос, но я не смог найти ответ специально для C в любом месте в Интернете.

+3

Используйте некоторое значение, полученное из 'gettimeofday()' вместо 'time()', если вам нужна более вторая точность. Это полностью ортогонально 'srand'. –

+2

Соответствующий выбор функции зависит от операционной системы – samgak

+1

Кроме того: если вы беспокоитесь о качестве ваших случайных чисел, [не используйте 'rand'] (https://www.securecoding.cert.org/confluence/ дисплей/с/MSC30-с +. У + не + с помощью + в + RAND() + функция + для + генерирующих + псевдослучайного + числа). – usr2564301

ответ

3

srand(time(NULL)); не является функцией, это скорее две функции: time(), которая возвращает текущее время в секундах с эпохи; и srand(), который инициализирует семя генератора случайных чисел. Вы инициализируете семена генератора числа rendom до текущего времени в секундах, что вполне разумно.

Однако у вас есть несколько заблуждений, вы только на самом деле нужно запустить srand один раз, или в лучшем случае один раз в несколько минут, после чего rand() будет продолжать генерировать более случайные числа самой по себе, srand() просто установить первоначальное семя Ранд, чтобы начать.

Во-вторых, если вы действительно хотите это сделать, в то время как я не понимаю, почему вы могли бы использовать функцию, которая возвращает время к более высокой точности. Я бы предложил gettimeofday() для этой цели.

+2

'поэтому, если программа запускается несколько раз в секунду' --- противоречит вашему второму абзацу. Я считаю, что OP не вызывает 'srand()' несколько раз в самом коде, программа запускается несколько раз. –

+1

@SouravGhosh Я говорю, что это неправильный подход, пользователь должен продолжать работу над программой, выполняемой дольше, и просто запустить rand(), чтобы получить больше случайных чисел. Позвольте мне сделать это яснее – Vality

+1

Ну, я не сказал, что вы не правы, просто сказал, что не предлагайте такие изменения, как «пользователь должен упорствовать в том, чтобы программа выполнялась дольше». Это действительно зависит от характера программы, не так ли? –

3

Вы можете попробовать получить начальное значение из другого источника. В системе UNIX, например, вы могли бы принести случайное значение четыре-байтовый из/разработчика/случайно:

void randomize() { 
    uint32_t seed=0; 
    FILE *devrnd = fopen("/dev/random","r"); 
    fread(&seed, 4, 1, devrnd); 
    fclose(devrnd); 
    srand(seed); 
} 
+0

Почему бы не использовать fread вместо fgetc? –

+0

Кроме того, вы не хотите использовать add, вы хотите использовать побитовое ИЛИ. –

+0

Возможно, стоит отметить, что это зависит от какой-то UNIX-ОС. – Vality

3

В Windows вы можете использовать GetTickCount() вместо time(). Он изменяется с интервалом 50 мс (если правильно помнить).