Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 C++ функция srand()
Здравствуйте, не могу понять как работает функция srand(), почему при помещении ее в цикл с rand() числа не генерируется случайно, а при вызове единожды все работает правильно?

 Re: C++ функция srand()
Аватара пользователя
Я так понял, что rand это формульный генератор целых случайных чисел с некоторым стартовым числом seed. Если перед обращением к ранду устанавливать определённый сид, то будет генерироваться одна и та же последовательность, что удобно, наверное, для каких-то целей.
Сид устанавливается функцией srand с параметром в виде значения этого сида. Если Вы в цикле перед обращением к генератору каждый раз инициализируете его одним и тем же сидом (а Srand без параметров устанавливает сид всегда в 1), то у Вас и будет генерироваться одно и то же число.
Если Вы будете вызывать srand (определённое число) до цикла, то у Вас будет генерироваться случайная последовательность, которую можно будет потом повторить.
Если Вы будете вызывать srand (системного времени) в цикле или до цикла, то у Вас будет генерироваться случайная последовательность, которую нельзя будет потом повторить.
Но в цикле вызывать srand( системного времени) это уже ненужное пижонство трато процессорных сил.

 Re: C++ функция srand()
Вопрос в догонку. Если я хочу генерировать одинаковые последовательности случайных чисел, то с каким постоянным параметром лучше вызывать srand(), чтобы получающаяся последовательность была наилучшей - максимально длинной, независимой и т.д.?

 Re: C++ функция srand()
Аватара пользователя
Насколько я знаком с вопросом, любое значение должно приводить к одной и той же (циклической) последовательности, выбирая лишь разные начальные номера в ней.

 Re: C++ функция srand()
DoctorZLO, если вам нужны псевдослучайные последовательности с как можно более «хорошими» статистическими свойствами, советую посмотреть в сторону не встроенных в стандартные библиотеки генераторов (обычно это линейный конгруэнтный): к примеру, метод Фибоначчи с запаздываниями, вихрь Мерсенна. И ещё много разных есть.
Притом, скорее всего, вам не придётся писать реализацию генератора самому: думаю, для C++ их пишут в первую очередь. :-) (Или одну из первых.)
С другой стороны, в стандартной библиотеке C++ вроде был класс для генерации криптостойких псевдослучайных чисел — его статистические свойства, по идее, также лучше.

-- Пн авг 22, 2011 17:26:22 --

worm2 в сообщении #476976 писал(а):
Насколько я знаком с вопросом, любое значение должно приводить к одной и той же (циклической) последовательности, выбирая лишь разные начальные номера в ней.
Не обязательно: может быть несколько циклов разной длины.

 Re: C++ функция srand()
2arseniiv
Цитата:
в стандартной библиотеке C++ вроде был класс для генерации криптостойких псевдослучайных чисел

Это какой-же? Или вы про C++11? Или про boost?

 Re: C++ функция srand()
Вот этого я и не помню. Помню, что где-то около был. Даже имени не вспомню, но, может, его звали crypto_random или похоже. :?

 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group