Нужно ли вызывать функцию 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(), который требует, чтобы вы вызывали его из всех потоков.