Ни один из типов C ++ std
не использует глобальные данные небезопасным способом. К двум не связанным между собой экземплярам такого типа можно получить доступ в разных потоках.
По умолчанию к одному экземпляру типа нельзя получить доступ из двух потоков без синхронизации.
Вам созданы локальные переменные. Эти локальные переменные не связаны ни с каким другим экземпляром своего типа. Здесь нет проблем с безопасностью потоков.
Псевдослучайные значения наиболее эффективно создаются при наличии состояния и его повторном использовании. Вы этого не делаете, поэтому создание случайного числа от 1 до 6 будет относительно дорогостоящим.
std::random_device seeder;
std::mt19937 engine(seeder());
std::uniform_int_distribution<int> dist(1, 6);
return dist(engine);
Ваше использование std::mt19937
излишне. Вы уже создаете random_device
, который можно передать непосредственно в dist
, а затем создать из него engine
, а затем использовать engine
. Использование engine
здесь бесполезно.
Обычно вы создаете engine
(какого-то типа, например mt19937
) один раз из seeder
. Затем вы сохраняете engine
и многократно передаете его в дистрибутивы.
При этом относительно дорогостоящая генерация «реальных случайных чисел» выполняется один раз для генерации длинной серии псевдослучайных чисел через механизм через распределение.
Обратите внимание, однако, что такое использование требует затрат; вы должны сохранить engine
и запретить многопоточный доступ к нему.
«Правильный» способ сделать это - иметь объект, который генерирует для вас случайные значения, и передавать его туда, где вам это нужно. Сохранение начального начального числа также позволит вам повторить выполнение набора задействованных случайных чисел.
Если вам не нравится идея явного обхода вашего случайного состояния, вы можете использовать thread_local
(или static
с mutex
охранником).
thread_local std::mt19937 engine(std::random_device{}());
std::uniform_int_distribution<int> dist(1, 6);
return dist(engine);
Это создает по одному engine
на поток, а engine
инициализируется значением из вашего random_device
.
person
Yakk - Adam Nevraumont
schedule
17.11.2016