2017-03-09 75 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年)。