Здесь много ответов, но никто, похоже, не действительно объяснил, почему rand () всегда генерирует одну и ту же последовательность, учитывая одно и то же семя - или даже то, что семя действительно делает , Так что вот так.
Функция rand () поддерживает внутреннее состояние. Концептуально, вы можете думать об этом как о глобальной переменной некоторого типа, называемой rand_state. Каждый раз, когда вы вызываете rand (), он делает две вещи. Он использует существующее состояние для вычисления нового состояния и использует новое состояние для вычисления числа, которое вам возвращается:
state_t rand_state = INITIAL_STATE;
state_t calculate_next_state(state_t s);
int calculate_return_value(state_t s);
int rand(void)
{
rand_state = calculate_next_state(rand_state);
return calculate_return_value(rand_state);
}
Теперь вы можете видеть, что каждый раз, когда вы вызываете rand (), он заставляет rand_state двигаться на один шаг по заранее определенному пути. Случайные значения, которые вы видите, основаны только на том, где вы находитесь на этом пути, поэтому они также будут следовать заранее определенной последовательности.
Теперь вот где приходит srand (). Он позволяет вам перейти к другой точке пути:
state_t generate_random_state(unsigned int seed);
void srand(unsigned int seed)
{
rand_state = generate_random_state(seed);
}
Точная информация о state_t, Calculate_next_state (), calc_return_value () и generate_random_state () может варьироваться от платформы к платформе, но обычно они довольно просты.
Из этого видно, что при каждом запуске вашей программы rand_state будет запускаться с INITIAL_STATE (что эквивалентно generate_random_state (1)) - поэтому вы всегда получаете одну и ту же последовательность, если не используете srand ().