2014-03-06 41 views
9

什麼是C++ 11 - 隨機設備使用

std::random_device rd; 
std::mt19937 gen(rd()); 
std::uniform_int_distribution<int> dist(0, 100); 
for (int n = 0; n < 100; ++n) 
    std::cout<<dist(gen)<<std::endl; 

std::random_device rd; 
std::uniform_int_distribution<int> dist(0, 100); 
for (int n = 0; n < 100; ++n) 
    std::cout<<dist(rd)<<std::endl; 

第一個例子使用RD()作爲種子之間的不同,但輸出是相似的,我想首先知道什麼是優點。

回答

7

區別在於,在第一個示例中,您特別將mersenne-twister設置爲隨機數生成器。 mersenne-twister是一個僞隨機生成器,用來自std :: random_device的值播種。 mersenne-twister被認爲是一個非常好的僞隨機生成器,並且會快速生成大量高質量的僞隨機值。

std::random_device是一個「真正的」隨機數發生器,因爲它使用不同的隨機過程來生成實際上是隨機的數字。因此,如果您需要大量隨機數,速度非常快,因爲它取決於發生的這些隨機事件(例如,用戶輸入,廣告測量中的噪聲等),以便創建一個隨機狀態,所以我認爲它不適合。

+0

我在windows vc11發佈模型上測試的性能是相同的。可能取決於隨機設備的實現。我同意mt19937質量更好 – jean

+0

質量問題並不那麼簡單。一個真正的隨機數發生器應該產生更好的隨機數,但只要你要求它產生許多隨機數,它就不能從計算機系統「消耗」足夠的隨機事件來真正產生真正的隨機數。 – PureW

+0

但是,你是對的,實現可能會有很大的不同。 – PureW