47 lines
1.2 KiB
C++
47 lines
1.2 KiB
C++
#ifndef RANDOM_H_
|
|
#define RANDOM_H_
|
|
|
|
#include <random>
|
|
#include <vector>
|
|
|
|
namespace sc {
|
|
|
|
class random {
|
|
public:
|
|
static random& instance() { return singleton; }
|
|
|
|
// forbid copying
|
|
random(const random&) = delete;
|
|
random& operator=(const random&) = delete;
|
|
|
|
// forbid moving
|
|
random(random&&) = delete;
|
|
random& operator=(random&&) = delete;
|
|
|
|
std::default_random_engine& engine() { return _reng; }
|
|
|
|
static bool boolean();
|
|
static int int_between(int from, int to);
|
|
static double double01();
|
|
static double double_between(double from, double to);
|
|
|
|
template <typename T>
|
|
static T choice(const std::vector<T>& vec) {
|
|
std::uniform_int_distribution<int> dist {0, vec.size() - 1};
|
|
return vec[dist(instance()._reng)];
|
|
}
|
|
|
|
private:
|
|
static random singleton;
|
|
|
|
random() = default;
|
|
~random() = default;
|
|
|
|
std::random_device _rdev {};
|
|
std::default_random_engine _reng {_rdev()};
|
|
};
|
|
|
|
}
|
|
|
|
#endif // RANDOM_H_
|