Próbowałem zaimplementować algorytm "Monte Carlo" równolegle, więc muszę użyć bezpiecznej wątkowo wersji generatora liczb losowych.
Dużo szukałem i w końcu znalazłem int qrand () która jest bezpieczną wątkowo wersją standardowej funkcji rand() języka C++ (zdefiniowanej w <cstdlib> i <stdlib.h>). Kiedy go używam, VS wystrzelił błąd „nie znaleziono identyfikatora”.

Używam MS visual studio'10 i napisałem swój kod w C++ używając OMP.

Jakaś pomoc?

c++
1
N0rA 7 marzec 2012, 22:16

2 odpowiedzi

Najlepsza odpowiedź

boost::random ma wiele generatorów, które są obiektami. ten najprostszym rozwiązaniem byłoby po prostu użycie osobnego generatora dla każdego nitka.

3
James Kanze 7 marzec 2012, 22:34

Dla C++ użyj standardowej biblioteki <random>. Jak sugeruje James Kanze, prawdopodobnie najlepszy byłby inny generator dla każdego wątku, a ich wykonanie nie jest trudne:

#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();
});

Używam tylko std::async(), aby pokazać, że generator jest tworzony w wątku. MSVC 10 nie ma std::async() Nie sądzę, ale ma <random>, więc zrobisz to samo, używając dowolnej biblioteki wątków, której już używasz.

6
bames53 21 styczeń 2016, 21:17