Нужно ли вызывать функцию srand() C на поток или на процесс для семени рандомизатора?
Подпись в значительной степени говорит об этом.
PS. Это для программы С++ Windows.
Ответ 1
В соответствии с документацией MSDN на srand() (при условии, что вы используете библиотеку времени выполнения Microsoft C), семя является нито-локальным, поэтому вам нужно вызвать srand() для каждого потока, использующего rand(). Обратите внимание, что это может быть не в случае других реализаций.
Цитата из MSDN:
Функция srand устанавливает начальную точку для генерации ряда псевдослучайных целых чисел в текущем потоке.
Ответ 2
Даже если ответ не был специфичным для платформы, я предлагаю вам избежать srand() и использовать <random>. Библиотека С++ 11 <random> не только обеспечивает четкую семантику в многопоточных программах, но также предоставляет гораздо лучшие возможности для генерации случайных чисел. Он предоставляет несколько разных генераторов случайных чисел для удовлетворения различных требований к качеству, скорости и размерам и многих стандартных дистрибутивов, поэтому вы не будете делать ошибки, которые люди часто делают при использовании rand.
Ответ 3
Нет, в соответствии со стандартом, поскольку после вызова srand() он влияет на rand() вызовы всех потоков.
Функция библиотеки C srand() является однопоточной, как и все остальные функции, что означает, что если вы вызываете srand() из одного потока, это влияет на число-seqeunce, сгенерированное из rand(), в других потоках.
Но Microsoft предоставляет нестандартный srand(), который требует, чтобы вы вызывали его из всех потоков.