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