在你将其标记为重复之前(因为我知道这已被多次询问)我已经阅读了StackOverflow上的许多问题/答案以及许多其他“教程”等。
尽管遵循了我所知的所有建议,但我的代码每次运行时都生成相同的“随机”数字。它看起来并不像我在做我应该做的事情。为什么这不起作用?
#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语句中缺少中断。真的很简单。发电机工作正常。我忘了把它们包括在我过度的状态中,感觉非常愚蠢。 的然而... 跳过此问题的评论和答案的数量突出显示它是多么容易。我现在感觉有点不那么愚蠢...
答案 0 :(得分:5)
从技术上讲,这是有效的行为。来自cppreference:
如果非确定性源(例如,硬件设备)对于实现不可用,则可以根据实现定义的伪随机数引擎来实现
std::random_device
。在这种情况下,每个std::random_device
对象可以生成相同的数字序列。
如果你更喜欢标准的引用,那就是[rand.device] / 2:
如果实施限制阻止生成非确定性随机数,则实施可以使用随机数引擎。
random_device::entropy()
应该用于检查这个,但不幸的是它在大多数库中没有正确实现,因为链接的文档声明(我可以确认它适用于GCC 6.3,Clang 3.9和MSVC 2015)。 / p>
答案 1 :(得分: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;
}
}