我正在尝试使用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);
}
但是在每次执行时我得到相同的数字......
答案 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
。