Функция rand
генерирует некоторую последовательность чисел. (Последовательность вычисляется, но предназначена для использования так, как если бы числа были случайными, поэтому они называются псевдослучайными.) Сама по себе она всегда будет генерировать одну и ту же последовательность чисел в программе. Мы используем srand
, чтобы выбрать, какую последовательность чисел он генерирует. (Чаще всего rand
генерирует цикл тех же чисел, если вызывается достаточное количество раз, а srand
просто выбирает, где в этом цикле мы начинаем.)
Итак, вы вызываете srand
, чтобы установить начальную точку последовательности для rand
. Значение, которое вы передаете srand
, - это любое значение unsigned int
. В стандарте C для значения нет определенного значения. Вы просто даете srand
число, например 1, чтобы получить одну последовательность, 2, чтобы получить другую последовательность, 3, чтобы получить другую последовательность, и так далее. У вас нет другого контроля над фактическими генерируемыми значениями; установка для начального числа определенного значения не гарантирует, что первый вызов rand
вернет какое-либо конкретное задокументированное значение.
Стандарт C также не определяет какой-либо метод вычисления чисел в последовательности. Каждая реализация C может выбрать свой собственный метод. В некоторых реализациях C используются плохие методы, в которых числа совсем не случайны, а некоторые закономерности легко заметить. (По этой причине часто рекомендуется использовать альтернативы, такие как srandom
и random
Unix.)
Когда программа отлаживается или используется в качестве присвоения класса, обычно вызывается srand
с фиксированным значением, например srand(2020)
. В результате rand
каждый раз генерирует одни и те же числа. Это упрощает отладку программы или проверку результатов студенческих программ. Когда создаются различные последовательности номеров, обычно srand
называют srand(time(NULL))
. Предполагая, что время доступно (time(NULL)
может вернуть -1 в случае ошибки), это заставляет программу использовать разные последовательности в разное время. (Обычно значение time
как целое число изменяется раз в секунду, но это может варьироваться в зависимости от реализации C.)
person
Eric Postpischil
schedule
12.12.2020
rand()
, но обычно это одно из следующих: en.wikipedia.org/ wiki / Linear_congruential_generator - person Shawn   schedule 12.12.2020srand()
, тогда используется начальное число по умолчанию (что бы оно ни было) иrand()
, вероятно, производит ту же последовательность. Если вы вызываетеsrand(2020)
, то это начальное число используется каждый раз при запуске программы, и снова создается та же последовательность, но отличная от первой. Если вы вызываетеsrand(time(NULL))
, PRNG заполняется текущим временем в секундах, поэтому вы получаете другую последовательность при каждом запуске программы (если отмечена одна секунда). - person Weather Vane   schedule 12.12.2020rand() / (RAND_MAX + 1.0 + MIN) * MAX
- неправильный способ масштабирования диапазона. Для простого назначения класса вы можете использоватьrand() % (MAX-MIN+1) + MIN
, предполагая, что вы хотите включить какMAX
, так иMIN
. Это имеет некоторые недостатки, когдаrand
низкого качества, но это терпимо для школьных занятий. - person Eric Postpischil   schedule 12.12.2020rand/srand
, но концептуально объясняет, как работают генераторы псевдослучайных чисел. В случае реализацииrand
на основе lcg, упоминаются функцииf()
иh()
:f(seed) == seed
иh(state) == state
. - person pjs   schedule 12.12.2020