2014 dxdy logo

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

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




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

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

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

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

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

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

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

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

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

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

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


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