c++ c++11 random openmp

c++ - Seguridad del hilo de std:: random_device



c++11 openmp (1)

No es una buena idea usar el dispositivo aleatorio en paralelo. Incluso si está bloqueando, es posible que no tenga problemas con la superposición de flujos de números aleatorios, pero agrega un punto de sincronización adicional.

Debe configurar tantos motores de números aleatorios (RNE) como tantos subprocesos que desee iniciar, omp_get_num_threads() . Crea un std :: vector de RNE y sembralos en la parte secuencial de tu programa. Para sembrar puede usar el dispositivo aleatorio y un std::seed_seq .

Luego use en cada hilo el RNE asociado con el número de hilo, omp_get_thread_num() .

¡Nunca use el dispositivo aleatorio para generar números aleatorios, es lento y en general no genera números aleatorios distribuidos uniformemente!

Dependiendo de la calidad de los números aleatorios que necesite, puede usar uno de los generadores de números aleatorios predefinidos. Si está haciendo simulaciones de Monte Carlo o Criptografía, tenga mucho cuidado con el algoritmo que elija.

Encontrará mucha información útil sobre motores aleatorios en https://en.cppreference.com/w/cpp/numeric/random .

Tengo un código que se parece un poco a esto:

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() */ } }

Tengo algunas preguntas:

  • ¿Es seguro el subproceso std::random_device ? es decir, ¿va a hacer algo inútil cuando varios subprocesos lo llaman a la vez?
  • ¿Es esta generalmente una buena idea? ¿Debo preocuparme por la superposición de flujos de números aleatorios?
  • ¿Hay una mejor manera de lograr lo que quiero (flujos de números aleatorios independientes en cada hilo, no estoy muy preocupado por la reproducibilidad en este momento)?

En caso de que exista alguna diferencia en el funcionamiento de std::random_device , estoy ejecutando principalmente en Windows, aunque me gustaría que el código funcionara igualmente bien en Linux y OSX.