24#ifndef DUMUX_COMMON_RANDOM_HH
25#define DUMUX_COMMON_RANDOM_HH
41template<
class Scalar =
double>
46 Parameters(Scalar
a, Scalar
b)
49 Scalar
a()
const {
return a_; }
50 Scalar
b()
const {
return b_; }
78 {
return { offset_, offset_+size_ }; }
80 Scalar
a()
const {
return offset_; }
81 Scalar
b()
const {
return offset_ + size_; }
83 template<
class Generator,
84 typename std::enable_if_t<std::is_same_v<typename Generator::result_type, std::uint_fast32_t>,
int> = 0>
86 {
return offset_ + size_*(0x1.0p-32 * gen()); }
101template<
class Scalar =
double>
106 Parameters(Scalar
m, Scalar
s)
109 Scalar
m()
const {
return m_; }
110 Scalar
s()
const {
return s_; }
138 {
return { mean_, stddev_ }; }
140 Scalar
m()
const {
return mean_; }
141 Scalar
s()
const {
return stddev_; }
143 template<
class Generator>
153 const auto [u1, u2] = generateUniformPair_(gen);
155 using std::sqrt;
using std::log;
156 using std::cos;
using std::sin;
157 constexpr Scalar twoPi = 2.0 * M_PI;
159 const Scalar magnitude = stddev_ * sqrt(-2.0 * log(u1));
160 const Scalar z0 = magnitude * cos(twoPi * u2) + mean_;
161 const Scalar z1 = magnitude * sin(twoPi * u2) + mean_;
168 template<
class Generator,
169 typename std::enable_if_t<std::is_same_v<typename Generator::result_type, std::uint_fast32_t>,
int> = 0>
170 auto generateUniformPair_(Generator& gen)
174 constexpr Scalar eps = std::numeric_limits<Scalar>::epsilon();
175 Scalar u1 = 0.0, u2 = 0.0;
177 u1 = 0x1.0p-32 * gen();
178 u2 = 0x1.0p-32 * gen();
180 return std::make_pair(u1, u2);
185 bool isCached_ =
false;
186 Scalar cachedValue_ = {};
196template<
class Scalar =
double>
205 : normal_(mean, stddev)
217 { normal_.param(p); }
220 {
return normal_.param(); }
222 Scalar
m()
const {
return normal_.m(); }
223 Scalar
s()
const {
return normal_.s(); }
225 template<
class Generator>
229 return exp(normal_(gen));
Scalar b() const
Definition: random.hh:81
Scalar a() const
Definition: random.hh:80
SimpleUniformDistribution()
Definition: random.hh:67
void param(const Parameters &p)
Definition: random.hh:71
SimpleUniformDistribution(Scalar min, Scalar max=1.0)
Definition: random.hh:58
SimpleUniformDistribution(const Parameters &p)
Definition: random.hh:63
Parameters param() const
Definition: random.hh:77
Scalar operator()(Generator &gen)
Definition: random.hh:85
Parameters param_type
Definition: random.hh:55
Scalar result_type
Definition: random.hh:56
Definition: random.hh:103
Scalar operator()(Generator &gen)
Definition: random.hh:144
Parameters param_type
Definition: random.hh:115
void param(const Parameters &p)
Definition: random.hh:131
SimpleNormalDistribution(const Parameters &p)
Definition: random.hh:123
SimpleNormalDistribution(Scalar mean, Scalar stddev=1.0)
Definition: random.hh:118
Scalar result_type
Definition: random.hh:116
Parameters param() const
Definition: random.hh:137
Scalar m() const
Definition: random.hh:140
SimpleNormalDistribution()
Definition: random.hh:127
Scalar s() const
Definition: random.hh:141
Definition: random.hh:198
Scalar operator()(Generator &gen)
Definition: random.hh:226
Scalar m() const
Definition: random.hh:222
SimpleLogNormalDistribution()
Definition: random.hh:212
Parameters param_type
Definition: random.hh:201
Parameters param() const
Definition: random.hh:219
SimpleLogNormalDistribution(const Parameters &p)
Definition: random.hh:208
SimpleLogNormalDistribution(Scalar mean, Scalar stddev=1.0)
Definition: random.hh:204
void param(const Parameters &p)
Definition: random.hh:216
Scalar s() const
Definition: random.hh:223
Scalar result_type
Definition: random.hh:202