7 #ifndef NSAS_RANDOM_NUMBER_GENERATOR_H
8 #define NSAS_RANDOM_NUMBER_GENERATOR_H
18 #include <boost/random/mersenne_twister.hpp>
19 #include <boost/random/uniform_int.hpp>
20 #include <boost/random/uniform_real.hpp>
21 #include <boost/random/variate_generator.hpp>
58 min_(std::min(min, max)), max_(std::max(min, max)),
59 dist_(min_, max_), generator_(rng_, dist_)
66 "when initializing UniformRandomIntegerGenerator");
70 rng_.seed(time(NULL));
82 boost::uniform_int<> dist_;
84 boost::variate_generator<boost::mt19937&, boost::uniform_int<> > generator_;
103 dist_(0, 1.0), uniform_real_gen_(rng_, dist_), min_(min)
107 areProbabilitiesValid(probabilities);
110 std::partial_sum(probabilities.begin(), probabilities.end(),
111 std::back_inserter(cumulative_));
113 rng_.seed(time(NULL));
119 dist_(0, 1.0), uniform_real_gen_(rng_, dist_), min_(0)
128 void reset(
const std::vector<double>& probabilities,
size_t min = 0)
131 areProbabilitiesValid(probabilities);
137 std::partial_sum(probabilities.begin(), probabilities.end(),
138 std::back_inserter(cumulative_));
147 return std::lower_bound(cumulative_.begin(), cumulative_.end(), uniform_real_gen_())
148 - cumulative_.begin() + min_;
164 void areProbabilitiesValid(
const std::vector<double>& probabilities)
const
166 double sum = probabilities.empty() ? 1.0 : 0.0;
167 for (
const double it : probabilities) {
169 if (it < 0.0 || it > 1.0) {
171 "probability must be in the range 0..1");
177 double epsilon = 0.0001;
179 if (std::fabs(sum - 1.0) >= epsilon) {
180 isc_throw(SumNotOne,
"Sum of probabilities is not equal to 1");
186 std::vector<double> cumulative_;
188 boost::uniform_real<> dist_;
193 typedef boost::variate_generator<boost::mt19937&, boost::uniform_real<> > UniformRealGenerator;
194 UniformRealGenerator uniform_real_gen_;
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
InvalidLimits(const char *file, size_t line, const char *what)
InvalidProbValue(const char *file, size_t line, const char *what)
SumNotOne(const char *file, size_t line, const char *what)
Weighted random integer generator.
WeightedRandomIntegerGenerator(const std::vector< double > &probabilities, size_t min=0)
Constructor.
void reset(const std::vector< double > &probabilities, size_t min=0)
Reset the probabilities.
WeightedRandomIntegerGenerator()
Default constructor.
size_t operator()()
Generate weighted random integer.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
Defines the logger used by the top-level component of kea-lfc.