我試圖以並行的方式實現「蒙特卡洛」算法,所以我需要使用線程安全版本的隨機數生成器。
我搜索了很多,終於發現 int qrand()
這是標準的C++ rand()
功能,(在<cstdlib>
和<stdlib.h>
定義)的線程安全版本。當我使用它時,VS解僱了「標識符未找到」錯誤。線程安全隨機數
我使用MS visual studio'10並使用OMP在C++中編寫我的代碼。
任何幫助?
我試圖以並行的方式實現「蒙特卡洛」算法,所以我需要使用線程安全版本的隨機數生成器。
我搜索了很多,終於發現 int qrand()
這是標準的C++ rand()
功能,(在<cstdlib>
和<stdlib.h>
定義)的線程安全版本。當我使用它時,VS解僱了「標識符未找到」錯誤。線程安全隨機數
我使用MS visual studio'10並使用OMP在C++中編寫我的代碼。
任何幫助?
boost::random
有一些發生器是對象。最簡單的解決方案是簡單地爲每個線程使用不同的生成器。
對於C++使用標準<random>
庫。正如詹姆斯甘孜建議,爲每個線程不同的生成很可能是最好的,他們是不難作出:
#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();
});
我只是用std::async()
表明,發電機在線程創建的。 MSVC 10沒有std::async()
我不這麼認爲,但它確實有<random>
,所以你只需使用你已經使用的線程庫就可以做同樣的事情。
您可能感興趣的這個問題http://stackoverflow.com/questions/8285067/c-super-fast-thread-safe-rand-function – 2012-03-07 18:22:37
我覺得'qrand'是Qt的一部分,不是標準的C++。也許你正在尋找'rand_r'? – 2012-03-07 18:34:08
請參閱http://stackoverflow.com/a/7114482/5987特別是有關併發性的部分。 – 2012-03-07 18:38:53