22 #ifndef EDSP_FISHER_DISTRIBUTION_HPP 23 #define EDSP_FISHER_DISTRIBUTION_HPP 28 namespace edsp {
namespace random {
57 template <
typename Distribution,
typename Engine = std::mt19937>
58 struct RandomGeneratorImpl {
59 using value_type =
typename Distribution::value_type;
60 template <
typename... Args>
61 explicit RandomGeneratorImpl(Args... arg) :
63 Engine(static_cast<std::size_t>(std::chrono::system_clock::now().time_since_epoch().count()))),
64 distribution_(Distribution(std::forward(arg...))) {}
66 inline value_type operator()() {
67 return static_cast<value_type
>(distribution_(generator_));
72 Distribution distribution_;
75 template <DistributionType Type,
typename T>
76 struct _RandomGenerator;
79 struct _RandomGenerator<DistributionType::
Uniform, T>
80 :
public RandomGeneratorImpl<std::uniform_real_distribution<T>> {};
83 struct _RandomGenerator<DistributionType::
Bernoulli, T>
84 :
public RandomGeneratorImpl<std::bernoulli_distribution, T> {};
87 struct _RandomGenerator<DistributionType::
Binomial, T>
88 :
public RandomGeneratorImpl<std::binomial_distribution<T>> {};
91 struct _RandomGenerator<DistributionType::
Geometric, T>
92 :
public RandomGeneratorImpl<std::geometric_distribution<T>> {};
95 struct _RandomGenerator<DistributionType::
Poisson, T>
96 :
public RandomGeneratorImpl<std::poisson_distribution<T>> {};
99 struct _RandomGenerator<DistributionType::
Exponential, T>
100 :
public RandomGeneratorImpl<std::exponential_distribution<T>> {};
102 template <
typename T>
103 struct _RandomGenerator<DistributionType::
Gamma, T> :
public RandomGeneratorImpl<std::gamma_distribution<T>> {};
105 template <
typename T>
106 struct _RandomGenerator<DistributionType::
Weibull, T>
107 :
public RandomGeneratorImpl<std::weibull_distribution<T>> {};
109 template <
typename T>
110 struct _RandomGenerator<DistributionType::
ExtremeValue, T>
111 :
public RandomGeneratorImpl<std::extreme_value_distribution<T>> {};
113 template <
typename T>
114 struct _RandomGenerator<DistributionType::
Normal, T> :
public RandomGeneratorImpl<std::normal_distribution<T>> {
117 template <
typename T>
118 struct _RandomGenerator<DistributionType::
LogNormal, T>
119 :
public RandomGeneratorImpl<std::lognormal_distribution<T>> {};
121 template <
typename T>
122 struct _RandomGenerator<DistributionType::
ChiSquared, T>
123 :
public RandomGeneratorImpl<std::chi_squared_distribution<T>> {};
125 template <
typename T>
126 struct _RandomGenerator<DistributionType::
Fisher, T>
127 :
public RandomGeneratorImpl<std::fisher_f_distribution<T>> {};
129 template <
typename T>
130 struct _RandomGenerator<DistributionType::
Student, T>
131 :
public RandomGeneratorImpl<std::student_t_distribution<T>> {};
133 template <
typename T>
134 struct _RandomGenerator<DistributionType::
Discrete, T>
135 :
public RandomGeneratorImpl<std::discrete_distribution<T>> {};
137 template <
typename T>
139 :
public RandomGeneratorImpl<std::piecewise_constant_distribution<T>> {};
141 template <
typename T>
142 struct _RandomGenerator<DistributionType::PieceWiseLinear, T>
143 :
public RandomGeneratorImpl<std::piecewise_linear_distribution<T>> {};
145 template <
typename T>
146 struct _RandomGenerator<DistributionType::
Cauchy, T> :
public RandomGeneratorImpl<std::cauchy_distribution<T>> {
158 template <DistributionType dist,
typename T>
167 template <
typename... Args>
175 return generator_.operator()();
179 internal::_RandomGenerator<dist, T> generator_;
184 #endif // EDSP_RANDOM_GENERATORDISTRIBUTION_HPP This class implements a random generator according to one of the discrete probability function availa...
Definition: random_generator.hpp:159
T value_type
Definition: random_generator.hpp:160
value_type operator()()
Generates a random number based in the chosen distribution.
Definition: random_generator.hpp:174
random_generator(Args... arg)
Creates a random generator.
Definition: random_generator.hpp:168
DistributionType
The DistributionType enum represents all the available distributions in the pseudo-random number gene...
Definition: random_generator.hpp:34
Definition: amplifier.hpp:29