I'm making the DrawNumber
function public
for my example. You can provide an overload that takes an upper bound, and then pass a new uniform_int_distribution::param_type
to uniform_int_distribution::operator()
The param_type
can be constructed using the same arguments as the corresponding distribution.
From N3337, §26.5.1.6/9 [rand.req.dist]
For each of the constructors of D
taking arguments corresponding to parameters of the distribution, P
shall have a corresponding constructor subject to the same requirements and taking arguments identical in number, type, and default values. Moreover, for each of the member functions of D
that return values corresponding to parameters of the distribution, P
shall have a corresponding member function with the identical name, type, and semantics.
where D
is the type of a random number distribution function object and P
is the type named by D
's associated param_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;
}
distribution
after first initializing them. How you should proceed depends a lot on what you use your random numbers for and why you need to change the bounds. – Fivepenny.param
method is new. Since this question is now 5 years old, perhaps the best course of action would be to mark the other as a duplicate and amend the accepted answer here? Alternatively just leave the questions as is :) – Caril