39 using namespace random;
48 set_range(MinVal, MaxVal);
58 m_generator.seed(m_seed);
77 m_distribution = make_shared<uniform_real_distribution<double>>(uniform_real_distribution<double>(0, 1));
86 return (m_MaxVal-m_MinVal)*m_distribution->operator()(m_generator)+m_MinVal;
104 return m_distribution->operator()(m_generator);
124 m_distribution = make_shared<poisson_distribution<int> >(poisson_distribution<int>(mean));
133 double val = m_distribution->operator()(m_generator);
135 while (val>=m_MaxVal || val<=m_MinVal)
136 val = m_distribution->operator()(m_generator);
158 m_distribution = make_shared<normal_distribution<double> >(normal_distribution<double>(mean, sigma));
167 double val = m_distribution->operator()(m_generator);
169 while (val>=m_MaxVal || val<=m_MinVal)
170 val = m_distribution->operator()(m_generator);
190 if (weights.size()==0) {
192 m_weights.erase(m_weights.begin(), m_weights.end());
193 m_weights.resize(m_values.size(), 1.);
195 else if (weights.size()!=values.size())
196 ErrorCBL(
"value and weight vectors have different sizes!",
"set_discrete_values",
"RandomNumbers.cpp");
202 for (
size_t i=0; i<m_values.size(); i++)
203 if (m_values[i]>=m_MaxVal || m_values[i]<=m_MinVal)
206 m_distribution = make_shared<discrete_distribution<int> >(discrete_distribution<int>(m_weights.begin(), m_weights.end()));
215 return m_values[m_distribution->operator()(m_generator)];
234 m_uniform_generator->set_seed(seed);
243 glob::FuncGrid ff(xx, distribution_function, interpolation_method);
249 newx.push_back(
Min(xx));
253 for (
size_t i=1; i<xx.size(); i++) {
258 newx.push_back(xx[i]);
264 m_distribution = make_shared<glob::FuncGrid>(FX, newx, interpolation_method);
273 return m_distribution->operator()(m_uniform_generator->operator()());
292 m_uniform_generator->set_seed(seed);
302 m_func_modelInput = modelInput;
303 m_func_parameter = pars;
Class functions used to generate random numbers.
double integrate_qag(const double a, const double b, const double rel_err=1.e-2, const double abs_err=1.e-6, const int limit_size=1000, const int rule=6)
compute the definite integral with GSL qag method
void set_seed(const int seed)
set the random number generator seed
CustomDistributionRandomNumbers(const distribution_func func, const std::shared_ptr< void > modelInput, const std::vector< double > parameter, const int seed, const double MinVal=par::defaultDouble, const double MaxVal=-par::defaultDouble)
constructor
double operator()()
extract number from the distribution
std::shared_ptr< UniformRandomNumbers > m_uniform_generator
Uniform random number generator.
void set_custom_distribution(const distribution_func func, const std::shared_ptr< void > modelInput, const std::vector< double > parameter)
set parameters for interpolated distribution
DiscreteRandomNumbers(const std::vector< double > values, const std::vector< double > weights, const int seed, const double MinVal=par::defaultDouble, const double MaxVal=-par::defaultDouble)
constructor
void set_discrete_values(const std::vector< double > values, const std::vector< double > weights)
set parameters for Discrete distribution
double operator()()
extract number from the distribution
DistributionRandomNumbers(const std::vector< double > xx, const std::vector< double > distribution_function, const std::string interpolation_method, const int seed)
constructor
std::shared_ptr< UniformRandomNumbers > m_uniform_generator
Uniform random number generator.
void set_seed(const int seed)
set the random number generator seed
double operator()()
extract number from the distribution
void set_interpolated_distribution(const std::vector< double > xx, const std::vector< double > distribution_function, const std::string interpolation_method)
set parameters for interpolated distribution
double operator()()
extract number from the distribution
void set_mean_sigma(const double mean, const double sigma)
set parameters for Normal distribution
NormalRandomNumbers(const double mean, const double sigma, const int seed, const double MinVal=par::defaultDouble, const double MaxVal=-par::defaultDouble)
constructor
void set_mean(const double mean)
set the mean for Poisson distribution
PoissonRandomNumbers(const double mean, const int seed, const double MinVal=par::defaultDouble, const double MaxVal=-par::defaultDouble)
constructor
double operator()()
extract number from the distribution
void set_seed(const int seed)
set the random number generator seed
double m_MinVal
minimum value to generate
RandomNumbers()=default
default constructor
double m_MaxVal
maximum value to generate
void set_range(const double MinVal, const double MaxVal)
set the range for the random number extraction
double GSL_root_brent(gsl_function Func, const double low_guess, const double up_guess, const double rel_err=1.e-3, const double abs_err=0)
function to find roots using GSL qag method
double GSL_integrate_qag(gsl_function Func, const double a, const double b, const double rel_err=1.e-3, const double abs_err=0, const int limit_size=1000, const int rule=6)
integral, computed using the GSL qag method
The global namespace of the CosmoBolognaLib
T Min(const std::vector< T > vect)
minimum element of a std::vector
int ErrorCBL(const std::string msg, const std::string functionCBL, const std::string fileCBL, const cbl::glob::ExitCode exitCode=cbl::glob::ExitCode::_error_)
throw an exception: it is used for handling exceptions inside the CosmoBolognaLib
T Max(const std::vector< T > vect)
maximum element of a std::vector
std::function< double(double, std::shared_ptr< void >, std::vector< double >)> distribution_func
generic distribution function