У меня есть некоторый код, который выглядит как это:безопасности Нить станд :: random_device
std::random_device rd;
#pragma omp parallel
{
std::mt19937 gen(rd());
#pragma omp for
for(int i=0; i < N; i++)
{
/* Do stuff with random numbers from gen() */
}
}
У меня есть несколько вопросов:
- Is
std::random_device
поточно? Т.е. он собирается делать что-то бесполезное, когда сразу несколько потоков называют его? - Это вообще хорошая идея? Должен ли я беспокоиться о перекрывающихся потоках случайных чисел?
- Есть ли лучший способ достичь того, что я хочу (независимые потоки случайных чисел в каждом потоке - я не слишком беспокоюсь о воспроизводимости на данный момент)?
В случае никакого значения для выработок std::random_device
я в первую очередь работает на Windows, хотя я хотел бы код, чтобы одинаково хорошо работать на Linux и OSX, а также.
Вы можете добиться воспроизводимости, но используя конкретное семя, а не используя 'std :: random_device'. – Galik
'random_device' скорее всего будет блокировать. Если вам нужен параллелизм, нет смысла использовать его таким образом. Вы можете использовать глобальный PRNG, засеянный с помощью 'random_device', для семени' mt19937' (но для этого потребуется явная блокировка). – sbabbi