我正在为我的示例制作DrawNumber函数public。您可以提供一个接受上限的重载,然后将新的传递uniform_int_distribution::param_type给uniform_int_distribution::operator()
param_type可以使用与相应分布相同的参数来构造。
从 N3337,§26.5.1.6/9 [rand.req.dist]
对于每一个D取参数对应分布的参数的构造函数,P应有一个对应的构造函数,其要求相同,取参数的数量、类型和默认值都相同。而且,对于D那个返回值对应的分布参数的每个成员函数,P都应该有一个对应的成员函数,其名称、类型和语义都相同。
其中D是随机数分布函数对象的类型,是由的关联P命名的类型Dparam_type
#include <iostream>
#include <random>
typedef unsigned int uint32;
class Random {
public:
Random() = default;
Random(std::mt19937::result_type seed) : eng(seed) {}
uint32 DrawNumber();
uint32 DrawNumber(uint32 ub);
private:
std::mt19937 eng{std::random_device{}()};
std::uniform_int_distribution<uint32> uniform_dist{0, UINT32_MAX};
};
uint32 Random::DrawNumber()
{
return uniform_dist(eng);
}
uint32 Random::DrawNumber(uint32 ub)
{
return uniform_dist(eng, decltype(uniform_dist)::param_type(0, ub));
}
int main()
{
Random r;
std::cout << r.DrawNumber() << std::endl;
std::cout << r.DrawNumber(42) << std::endl;
}