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

时间:2015-04-11 17:30:09

标签: c++ c++11 random

我正在尝试使用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);
}

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

- 编辑 - 在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);
}

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

1 个答案:

答案 0 :(得分:6)

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

在C ++中,成员按照它们在类中声明的顺序构造/初始化。在构建 m_randomdevice()之前,构造函数正在调用m_randomdevice

或者,摆脱m_randomdevice成员。您可以m_mt((std::random_device())())初始化m_mt