2014-02-12 4 views
3

Почему это происходит, когда я вызываю srand() в 2 очень разных точках, это приводит к тому, что числа не являются случайными? Как только я удалю один из них, он вернется к нормальному состоянию.Вызов srand() дважды в той же программе

+3

Вам нужно будет показать код, демонстрирующий, что вы имеете в виду, а также описать, что вы подразумеваете под «не случайным».'rand()' является генератором * pseudo * -случайных чисел; последовательность чисел, которые он генерирует, полностью определяется самым последним вызовом 'srand()'. – Sneftel

ответ

7

Это зависит от того, как вы это называете. Целью srand() является заселение генератора псевдослучайных чисел, используемого rand(). Поэтому, когда вы вызываете srand(i), он будет инициализировать rand() фиксированной последовательности, которая зависит от i. Поэтому, когда вы повторно семена с тем же семенем, вы начинаете получать одну и ту же последовательность.

Наиболее распространенным вариантом использования является размножение генератора только один раз и с подходящим «случайным» значением (например, идиоматический time(NULL)). Это гарантирует, что делает вероятным, что вы получите разные последовательности псевдослучайных чисел в разных исполнениях программы.

Однако иногда вы можете хотите, чтобы сделать псевдослучайную последовательность «воспроизводимой». Представьте, что вы тестируете несколько алгоритмов сортировки по случайным данным. Чтобы получить справедливые сравнения, вы должны протестировать каждый алгоритм по точно таким же данным, чтобы вы повторно запустили генератор с тем же семенем перед каждым прогоном.

Другими словами: если вы хотите, чтобы числа просто псевдослучайные, семя один раз и со значением как можно более случайным. Если вам нужен какой-то контроль & повторность, семя при необходимости.

0

Вы инициализируете srand? Вы должны инициализировать его в начале вы действуете/код вроде этого:

srand(time(NULL)); 

Он должен работать :)

+1

И что, по-вашему, происходит, когда вы вызываете 'srand (time (NULL));' позже в той же программе, достаточно скоро, что 'time (NULL)' возвращает то же самое значение, что и в первый раз? – hvd

+0

Ну, в конечном итоге это будет, но я предположил, что его программа не очень сложная. – falkon21

+0

"В конечном счете"? Я не имел в виду, что счетчик переполняется через несколько дней, я имел в виду вызов «время (NULL)» дважды в одну секунду (или любой другой элемент 'time_t' для конкретной системы). Особенно, если программа не сложная, полный запуск программы не требуется даже секунды. – hvd

1
srand (seed); 

Два разной инициализации с тем же семенем будет генерировать же последовательность результатов в последующих вызовах рандов.

Если семя установлено в 1, генератор повторно инициализируется до его начального значения и производит те же значения, что и перед любым вызовом rand или srand.

Каждый раз, когда rand() засевается srand(), он должен производить последовательность значений .

http://www.cplusplus.com/reference/cstdlib/srand/

http://en.cppreference.com/w/cpp/numeric/random/srand

0

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

#include <time.h> 

srand((unsigned int)time(0)); 
Смежные вопросы