如何在 C++11 中使用随机生成器作为 class 成员
How to use a random generator as a class member in C++11
我正在尝试将 std::mt19937 生成器用作 class 成员,但没有成功,但我总是得到相同的结果。这是我正在尝试的示例。
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);
}
但是在每次执行时我得到相同的数字...
移动 std::random_device m_randomdevice;
之前 std::mt19937 m_mt;
.
在 C++ 中,成员 constructed/initialized 按照它们在 class 中声明的顺序排列。你的构造函数正在调用 m_randomdevice()
before m_randomdevice
甚至被构造。
或者,删除 m_randomdevice
成员。你可以做 m_mt((std::random_device())())
初始化 m_mt
.
我正在尝试将 std::mt19937 生成器用作 class 成员,但没有成功,但我总是得到相同的结果。这是我正在尝试的示例。
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);
}
但是在每次执行时我得到相同的数字...
移动 std::random_device m_randomdevice;
之前 std::mt19937 m_mt;
.
在 C++ 中,成员 constructed/initialized 按照它们在 class 中声明的顺序排列。你的构造函数正在调用 m_randomdevice()
before m_randomdevice
甚至被构造。
或者,删除 m_randomdevice
成员。你可以做 m_mt((std::random_device())())
初始化 m_mt
.