2011-11-22 182 views
4

我最近學會了the hard way#<cstdlib> rand()不是線程安全的,在Linux上用互斥鎖實現,當多線程調用rand()時造成瓶頸。 rand_r作爲替代品,但有關於隨機數生成質量的concerns。此外,這種情況讓我質疑是否會有更快的隨機數生成器,因爲顯然我的代碼花費了大量的時間來生成隨機數。上面的鏈接中列出了一些替代方案,但我不確定其速度以及其他替代方案。C++高效計算和線程安全隨機函數

回答

11

如果您不需要任何統計控制跨越線程,只要使用由<random>提供的設施:

#include <random> 

typedef std:::mt19937 rng_type; 
std::uniform_int_distribution<rng_type::result_type> udist(0, 200); 

int main() // this can be per thread! 
{ 
    rng_type rng; 

    // seed rng first: 
    rng_type::result_type const seedval = get_seed(); 
    rng.seed(seedval); 

    rng_type::result_type random_number = udist(rng); 

    return random_number; 
} 

梅森倍捻機PRNG既快速又具有良好的統計特性。在每個線程中維護一個單獨的(並分開播種的)引擎對象,可以避免所有併發問題。

+0

FPA再次,呵呵? ;) –

+0

@ R.MartinhoFernandes:Shhhh .... –

+0

@Kerrek的''使用梅森扭轉者?它的速度與rand()相比如何?此外,新的隨機數如何獲得?我可以重複執行'= random_number',還是每次都必須執行'random_number = udist(rng);' –

2

在Linux中,您可以以非阻塞的方式從/dev/urandom中讀取。

+3

你不應該使用系統的熵來源*大*隨機性。 'urandom'對於播種很好,但不適用於持續的隨機數生成。就我所知,它甚至沒有明確的分佈。 –