2014-02-28 65 views
3

我使用的visual studio 2010不支持<chrono>,所以我必須種子default_random_engine。因此,我決定用rand種子是如下種子default_random_engine?

srand((unsigned int)time(NULL)); 
std::default_random_engine engine(rand()); 
std::normal_distribution<double> randn(0.0, 0.3); 

,而不是下面

unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); 
std::default_random_engine engine(seed); 
std::normal_distribution<double> randn(0.0, 0.3); 

我得到什麼,我希望爲獲取這兩種方法。我的問題是,是否有我使用rand()注意的任何注意事項? (注:我沒有選擇使用<chrono>

+1

您可能需要閱讀http://www.pcg-random.org/posts /cpp-seeding-surprises.html關於使用當前時間播種少數和/或播種時的問題的博客。 –

+0

@KaspervandenBerg,令人驚歎的鏈接。非常感謝。 – CroCo

回答

15

我建議從std::random_device抓種子:

std::default_random_engine engine(std::random_device{}()); 

應該爲您提供顯著更多的熵比std::time

+0

非常感謝。我會確定地使用它。 – CroCo

5

http://www.cplusplus.com/reference/random/random_device/,他們推薦您不使用std::random_device,因爲它不是便攜式的:

請注意,隨機偏差ces可能並不總是可用於生成 隨機數(並且在某些系統中,它們甚至可能永遠不可用 )。

在相關的頁面(http://www.cplusplus.com/reference/random/linear_congruential_engine/linear_congruential_engine/),他們給出的以下爲創建種子的例子:

unsigned seed1 = std::chrono::system_clock::now().time_since_epoch().count(); 
+0

兩個答案都是正確的,但這是最安全的。如果獲得PRNG中可能的最大熵很重要,那麼也可以檢查random_device的熵(如果prng用於生成種子,則std :: random_device :: entropy()返回0,因此它不是一個好選擇)如果它太低,則使用上面的time_since_epoch()調用。 – SullX