В C ++ 11 есть множество новых механизмов генерации случайных чисел и функций распределения. Они потокобезопасны? Если вы разделяете одно случайное распределение и движок между несколькими потоками, безопасно ли это и будут ли вы по-прежнему получать случайные числа? Сценарий, который я ищу, выглядит примерно так:
void foo() {
std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
#pragma omp parallel for
for (int i = 0; i < 1000; i++) {
double a = zeroToOne(engine);
}
}
с использованием OpenMP или
void foo() {
std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
dispatch_apply(1000, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
double a = zeroToOne(engine);
});
}
с использованием libdispatch.