52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
#ifndef RADII_LIB_RANDOM
|
|
#define RADII_LIB_RANDOM
|
|
|
|
#include <limits>
|
|
#include <random>
|
|
|
|
template <typename T = unsigned long> class random_number_generator {
|
|
std::random_device seed;
|
|
std::mt19937_64 generator;
|
|
std::uniform_int_distribution<T> range;
|
|
T l = std::numeric_limits<T>::min();
|
|
T h = std::numeric_limits<T>::max();
|
|
|
|
public:
|
|
random_number_generator(T high = std::numeric_limits<T>::max());
|
|
random_number_generator(T low, T high);
|
|
T operator()();
|
|
T operator()(T h);
|
|
T operator()(T l, T h);
|
|
};
|
|
|
|
template <typename T>
|
|
random_number_generator<T>::random_number_generator(T high) : h(high) {
|
|
generator.seed(seed());
|
|
range = std::uniform_int_distribution<T>(l, h);
|
|
}
|
|
|
|
template <typename T>
|
|
random_number_generator<T>::random_number_generator(T low, T high)
|
|
: l(low), h(high) {
|
|
generator.seed(seed());
|
|
range = std::uniform_int_distribution<T>(l, h);
|
|
}
|
|
|
|
template <typename T> T random_number_generator<T>::operator()() {
|
|
return range(generator);
|
|
}
|
|
|
|
template <typename T> T random_number_generator<T>::operator()(T high) {
|
|
h = high;
|
|
range = std::uniform_int_distribution<T>(l, h);
|
|
return range(generator);
|
|
}
|
|
|
|
template <typename T> T random_number_generator<T>::operator()(T low, T high) {
|
|
l = low;
|
|
h = high;
|
|
range = std::uniform_int_distribution<T>(l, h);
|
|
return range(generator);
|
|
}
|
|
|
|
#endif |