如何在C++ 11中使用随机生成器作为类成员

Fra*_*fer 3 c++ random c++11

我正在努力使用std :: mt19937生成器作为类成员,但我总是得到相同的结果.这是我正在尝试的一个例子.

class Level 
{
public:
    Level();
private:
   int generateTokenType();
   std::mt19937 m_mt;
   std::random_device m_randomdevice;
};

Level::Level(): m_mt(m_randomdevice())
{
}

int Level::generateTokenType()
{
    std::uniform_int_distribution<int> dist(0, 10);
    return dist(m_mt);
}
Run Code Online (Sandbox Code Playgroud)

我想要的是维护生成的发生器并在程序执行期间询问数字.

- 编辑 - 按照Cornstalks的回答,我做到了:

class Level
{
public:
   Level();
private:
   int generateTokenType();
   std::mt19937 m_mt;
};
Level::Level(): m_mt((std::random_device())())
{
    for(auto i = 0; i < 10; i++)
        std::cout<<generateTokenType()<<" ";
    std::cout<<std::endl;
}

int Level::generateTokenType()
{
    std::uniform_int_distribution<int> dist(0, 10);
    return dist(m_mt);
}
Run Code Online (Sandbox Code Playgroud)

但是在每次执行时我得到相同的数字......

Cor*_*lks 7

std::random_device m_randomdevice; 之前 移动std::mt19937 m_mt;.

在C++中,成员按照它们在类中声明的顺序构造/初始化.你的构造函数m_randomdevice() 构造之前m_randomdevice就已经调用了.

或者,摆脱m_randomdevice会员.你可以做m_mt((std::random_device())())初始化m_mt.

  • @FrameBuffer:mingw有一个破坏的std :: random_device.也许它仍然被打破.http://stackoverflow.com/questions/18880654/why-do-i-get-same-sequence-for-everyrun-with-stdrandom-device-with-mingw-gcc4 (4认同)