2017-03-09 24 views
2

/StackOverflow上回答以及許多其他'教程'等。C++ 11梅森難題產生相同的值每次

儘管下面,我所知道的,我的代碼生成每一次我運行相同的「隨機」號的所有建議。它看起來並不像我在做什麼不同於我應該做的事情。爲什麼這不起作用?在代碼/

#include <random> 
#include <iostream> 
using namespace std; 

random_device rd;  // used to initialise (seed) engine 
mt19937 mt(rd()); // random-number engine used (Mersenne-Twister in this case) 
uniform_int_distribution<int> dist(1, 4); // guaranteed unbiased 

後來在一個函數中:

for (it : vec_one) { 
    int rand_int = dist(mt); // Generate Random Number 
    switch (rand_int) 
    { 
    case 1: 
     cout << "One!" << endl; 
    case 2: 
     cout << "Two!" << endl; 
    case 3: 
     cout << "Three!" << endl; 
    case 4: 
     cout << "Four!" << endl; 
    default: 
     break; 
    } 
} 

從評論 switch語句中缺少休息答案。這真的很簡單。發電機正常工作。我忘記把它們包括在我過於樂觀的狀態中,感覺很愚蠢。 但是... 的是跳過這個問題上的亮點是多麼容易做到的意見和答案的數量。我覺得略少愚蠢現在......

+1

工作得很好,我見[這裏](http://coliru.stacked-crooked.com/a/61540450cafd9f1b)的活生生的例子,不知道自己在做什麼。你能發佈一個最小的可編譯示例嗎?順便說一下,你在'case'語句中沒有'break',所以你將會遇到case開關,最終你會得到'One!二!三!作爲展示的四個! – vsoftco

+0

你確定這是MSVC,而不是MinGW或什麼?最後我知道,libstdC++的Windows實現不會使'random_device'不確定(從標準的角度來看,這仍然是完全合法的)。 – chris

+1

在你的系統上'cout << rd.entropy()'的結果是什麼?另見http://www.cplusplus.com/reference/random/random_device/。如果你的系統沒有一個實際的非確定性隨機數發生器,你不會期望每次看到不同的序列(而'entropy()'理論上將返回0),並且應該使用[mt19937]構造函數一個實際的種子,而不是](http://www.cplusplus.com/reference/random/mersenne_twister_engine/mersenne_twister_engine/)(另請參閱這裏的例子)。 –

回答

1

switch語句缺少休息...
下面的代碼的伎倆。

for (it : vec_one) { 
    int rand_int = dist(mt); // Generate Random Number 
    switch (rand_int) 
    { 
     case 1: 
      std::cout << "One!" << std::endl; 
      break; 
     case 2: 
      std::cout<< "Two!" << std::endl; 
      break; 
     case 3: 
      std::cout<< "Three!" << std::endl; 
      break; 
     case 4: 
      std::cout<< "Four!" << std::endl; 
      break; 
     default: 
      break; 
     } 
    } 
+1

方式看透問題的核心。 –

5

從技術上講這是有效的行爲。從cppreference

std::random_device可以實現定義的僞隨機數引擎方面來實現,如果非確定性源(例如,硬件設備)不可用於執行。在這種情況下,每個std::random_device對象可能會生成相同的數字序列。

如果從標準更喜歡一個報價,它在[rand.device/2:

如果實施限制防止產生不確定性的隨機數,實施可以採用隨機數引擎。

random_device::entropy()是應該用來檢查這一點,但不幸的是它不是在大多數圖書館正確實施,作爲鏈接文檔的狀態(我可以證實它GCC 6.3,3.9鏘和MSVC 2015年)。

相關問題