2012-03-07 4 views
1

J'ai essayé d'implémenter l'algorithme "Monte Carlo" de manière parallèle, donc j'ai besoin d'utiliser une version thread-safe d'un générateur de nombres aléatoires.
Je beaucoup cherché et finalement trouvé int qrand() qui est une version thread-safe de la norme C++ rand() fonction, (définie dans <cstdlib> et <stdlib.h>). Quand je l'utilise, VS a déclenché une erreur "identifiant non trouvé". J'utilise MS Visual Studio'10 et écrit mon code en C++ en utilisant OMP.Nombre aléatoire de thread sécurisé

Une aide?

+1

Vous pourriez être intéressé par cette question http://stackoverflow.com/questions/8285067/c-super-fast-thread-safe-rand-function –

+1

Je pense que 'qrand' fait partie de Qt, pas de C++ standard. Peut-être que vous cherchez 'rand_r'? –

+0

Voir http://stackoverflow.com/a/7114482/5987 en particulier la partie sur la concurrence. –

Répondre

3

boost::random a un certain nombre de générateurs qui sont des objets. La solution la plus simple serait de simplement utiliser un générateur distinct pour chaque fil .

6

Pour C++, utilisez la bibliothèque <random> standard. Comme James Kanze l'indique, un générateur différent pour chaque thread serait probablement mieux, et ils ne sont pas difficiles à faire:

#include <random> 

std::mt19937 make_seeded_engine() { 
    std::random_device r; 
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()}; 
    return std::mt19937(seed); 
} 

std::async([](){ 
    auto rand = std::bind(std::uniform_real_distribution<>(), 
          make_seeded_engine()); 
    for(int i = 0; i < 100; ++i) 
     rand(); 
}); 

Je suis juste en utilisant std::async() pour montrer que le générateur est créé dans le fil. MSVC 10 n'a pas std::async() Je ne pense pas, mais il a <random>, donc vous ferez la même chose en utilisant n'importe quelle bibliothèque de threads que vous utilisez déjà.

Questions connexes