我正在努力使用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)
但是在每次执行时我得到相同的数字......
std::random_device m_randomdevice; 之前 移动std::mt19937 m_mt;.
在C++中,成员按照它们在类中声明的顺序构造/初始化.你的构造函数m_randomdevice() 在 构造之前m_randomdevice就已经调用了.
或者,摆脱m_randomdevice会员.你可以做m_mt((std::random_device())())初始化m_mt.
| 归档时间: |
|
| 查看次数: |
2386 次 |
| 最近记录: |