2012-03-07 41 views
1

"Monte Carlo"アルゴリズムを並列に実装しようとしましたので、乱数ジェネレータのスレッドセーフ版を使用する必要があります。
は、私は多くのことを検索し、最終的には、標準C++ rand()機能、(<cstdlib><stdlib.h>で定義されている)のスレッドセーフなバージョンです int qrand() を見つけました。私がそれを使用すると、VSは "識別子が見つかりません"というエラーを出しました。スレッドセーフな乱数

私はMS visual studio'10を使用し、OMPを使用してC++で自分のコードを書きました。

助けが必要ですか?

+1

あなたはこの質問に興味があるかもしれませんhttp://stackoverflow.com/questions/8285067/c-super-fast-thread-safe-rand-function –

+1

'qrand'は標準C++ではなくQtの一部だと思います。おそらくあなたは 'rand_r'を探しているでしょうか? –

+0

http://stackoverflow.com/a/7114482/5987特に並行性に関する部分を参照してください。 –

答えて

3

boost::randomには、オブジェクトであるいくつかのジェネレータがあります。 の最も簡単な解決策は、各スレッドに対して個別のジェネレータを使用することです。

6

C++の場合、標準<random>ライブラリを使用してください。ジェームズ・観世が示すように、スレッドごとに異なるジェネレータは、おそらく最高だろう、と彼らは作るのが難しいじゃない:私はちょうど発電機がスレッドで作成されたことを示すためにstd::async()を使用してい

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

。 MSVC 10にはstd::async()はありませんが、それは<random>なので、すでに使用しているスレッドライブラリを使って同じことをします。

関連する問題