C ++ 11 Mersenne Twister每次产生相同的值

时间:2017-03-09 02:21:29

标签: c++ c++11 visual-c++ random

在你将其标记为重复之前(因为我知道这已被多次询问)我已经阅读了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语句中缺少中断。真的很简单。发电机工作正常。我忘了把它们包括在我过度的状态中,感觉非常愚蠢。 的然而... 跳过此问题的评论和答案的数量突出显示它是多么容易。我现在感觉有点不那么愚蠢...

2 个答案:

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