2017-03-09 14 views
2

これを重複してタグ付けする前に(私はこれが何回も尋ねられていることを知っています)、私はStackOverflowだけでなく数多くの質問/回答を読みました'チュートリアル'など。C++ 11 Mersenne Twisterは毎回同じ値を返します

私が知っているすべての推奨事項にもかかわらず、私のコードは実行するたびに同じ "ランダム"番号を生成します。私は私が何をすべきかとは異なる何かをしているように私には見えません。なぜこれは機能しないのですか?

#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 

後のコードで/関数内:コメントswitch文で 欠落休憩から

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; 
    } 
} 

回答。それは本当に簡単でした。ジェネレータは正常に動作します。私は彼らを過度の状態に含めるのを忘れて、とても馬鹿だと感じました。 しかし... この問題をスキップするコメントと回答の数は、それがどれほど簡単かを示しています。私はちょっと愚かな気がします...

+1

が私のためにうまく動作しますが、何をやっているかわからない、ライブたとえば、[ここ](http://coliru.stacked-crooked.com/a/61540450cafd9f1b)を参照してください。最小限のコンパイル可能なサンプルを投稿できますか?ところで、 'case'ステートメントに' break'sがないので、ケーススイッチに入ると 'One!二!三! 4! 'と表示されます。 – 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オブジェクトは同じ番号シーケンスを生成する可能性があります。あなたは、標準からの引用を好む場合

、それは/ 2 [rand.device]である:

実装上の制限は、非決定論的乱数を生成できない場合は、実装が乱数エンジンを採用してもよいです。

random_device::entropy()はこれをチェックするために使用されることを想定しているが、残念ながらそれが連結ドキュメントの状態として、ほとんどのライブラリで正しく実装されていない(と私はGCC 6.3のためにそれを確認することができ、クラン3.9とMSVC 2015)。

関連する問題