Немножко теории. Генератор псевдослучайных чисел может генерировать множество псевдослучайных последовательностей. Какую именно он будет генерировать здесь и сейчас определяет sid. Собственно srand его и задаёт. После того, как sid установлен (обновлён) следующий вызов randr() вернёт первый элемент последовательности, вызвав randr() ещё раз ты получаешь второй элемент последовательности и так далее. Если ты установишь sid ещё раз то всё начинается по новой.
Пример кода:
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
srand(10);
cout << "set sid to " << 10 << endl;
cout << "random number: " << rand() << endl;
srand(10);
cout << "set sid to " << 10 << endl;
cout << "random number: " << rand() << endl;
cout << "random number: " << rand() << endl;
srand(10);
cout << "set sid to " << 10 << endl;
cout << "random number: " << rand() << endl;
cout << "random number: " << rand() << endl;
cout << "random number: " << rand() << endl;
srand(11);
cout << "set sid to " << 11 << endl;
cout << "random number: " << rand() << endl;
srand(11);
cout << "set sid to " << 11 << endl;
cout << "random number: " << rand() << endl;
cout << "random number: " << rand() << endl;
srand(11);
cout << "set sid to " << 11 << endl;
cout << "random number: " << rand() << endl;
cout << "random number: " << rand() << endl;
cout << "random number: " << rand() << endl;
}
Очень наглядно демонстрирует как это всё работает.
Всё это рассчитано на то, что, что srand зовётся только один раз в начале программы, или по крайней мере не очень часто.