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
|