Надпись в значительной степени говорит об этом.
PS. Это для программы C++ Windows.
Надпись в значительной степени говорит об этом.
PS. Это для программы C++ Windows.
Согласно документации MSDN на srand()
(при условии, что вы используете среду выполнения Microsoft C библиотека), начальное значение является локальным для потока, поэтому вам нужно вызывать srand()
для каждого потока, использующего rand()
. Обратите внимание, что это может быть не так в других реализациях.
Цитата из MSDN:
Функция srand устанавливает начальную точку для генерации серии псевдослучайных целых чисел в текущем потоке.
srand()
или rand()
были потокобезопасными.
- person dreamlax; 15.04.2012
rand()
в том, что он генерирует фиксированную последовательность, начиная с начального числа. Трудно понять, насколько это полезно, когда вызовы из других потоков могут изменить последовательность, которую получает вызывающий поток. (Конечно, это справедливый аргумент, что даже если это исправление, это наземная мина, поскольку функция имеет то же имя, но другую семантику.)
- person David Schwartz; 15.04.2012
Даже если бы ответ не был специфичен для платформы, я бы посоветовал вам избегать srand()
и вместо этого использовать <random>
. Библиотека C++11 <random>
не только обеспечивает четкую семантику в многопоточных программах, но и предоставляет гораздо лучшие возможности для генерации случайных чисел. Он предоставляет несколько различных генераторов случайных чисел для удовлетворения различных требований к качеству, скорости и размеру, а также множество стандартных дистрибутивов, поэтому вы не совершите ошибок, которые часто делают люди при использовании rand
.
Нет, согласно Стандарту, потому что когда вы вызываете srand()
, это влияет на rand()
вызовов из всех потоков.
Функция библиотеки C srand()
является однопоточной, как и все другие функции, а это означает, что если вы вызываете srand()
из одного потока, она влияет на числовую последовательность, сгенерированную из rand()
, и в других потоках.
Но Microsoft предоставляет нестандартный srand()
, который действительно требует, чтобы вы вызывали его из всех потоков.
No
.
- person Nawaz; 15.04.2012
srand
. (Я не уверен на 100%, что это необходимо для соответствия С++ 11, но я верю, что это так.)
- person David Schwartz; 15.04.2012
srand()
и rand()
не требуются, чтобы избежать гонок данных, несмотря на то, что язык теперь имеет стандартизированную поддержку потоков.
- person dreamlax; 15.04.2012
Имейте в виду, что состояние является локальным для волокна (более детализированным, чем локальное для потока). Таким образом, для каждого волокна необходимо вызывать srand. (Конечно, если вы не используете волокна, это эквивалентно локальному потоку.)