Я знаю, что rand() не является потокобезопасным, поэтому я не совсем уверен в этом. удивлен тем, что все потоки получат одну и ту же последовательность (поскольку я предполагаю, что генератору потребуется некоторая синхронизация кэша, чтобы избежать этого), но я удивлен, что заполнение prng в хост-процессе перед созданием потоков, похоже, не оказывает никакого влияния на последовательность.
Например, в комментарии к вопросу:
Темы, как самостоятельно засеять генератор случайных чисел?
говорится, что «не следует задайте свой генератор в потоках. Задайте его перед запуском любого потока. Генератор, который вы используете с rand() и srand(), уникален для всей программы."
Итак, мой вопрос: это:
Получает ли каждый поток отдельную копию генератора или почему ее заполнение в хост-процессе не влияет на последовательность?
Следует минимальный пример кода, воспроизводящий проблему. .
Я знаю, что это не очень хорошие семена или передовая практика, но это демонстрирует то, о чем я говорю.
Когда я запускаю это (вообще без раздачи):< /p>
Код: Выделить всё
#include
#include
#include
#include
using namespace std;
void test(int id, mutex &channel)
{
// srand(id);
channel.lock();
cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78473492/does-each-thread-have-its-own-copy-of-the-rand-prng[/url]