45#ifndef LASS_GUARDIAN_OF_INCLUSION_NUM_DISTRIBUTION_INL
46#define LASS_GUARDIAN_OF_INCLUSION_NUM_DISTRIBUTION_INL
52#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
54# pragma warning(disable: 4996)
56# pragma GCC diagnostic push
57# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
67template <RangeType rangeType>
struct RangePolicy;
73 static bool isInRange(
const T& x,
const T& inf,
const T& sup) {
return x >= inf && x <= sup; }
80 static bool isInRange(
const T& x,
const T& inf,
const T& sup) {
return x > inf && x <= sup; }
87 static bool isInRange(
const T& x,
const T& inf,
const T& sup) {
return x >= inf && x < sup; }
94 static bool isInRange(
const T& x,
const T& inf,
const T& sup) {
return x > inf && x < sup; }
107template <
typename T,
class RG, RangeType RT>
119template <
typename T,
class RG, RangeType RT>
122 generator_(&generator),
125 scale_(static_cast<long double>(supremum - infimum) /
TGenerator::max())
131template <
typename T,
class RG, RangeType RT>
inline
133DistributionUniform<T, RG, RT>::operator()()
const
135 LASS_ASSERT(generator_);
139 result = infimum_ +
static_cast<TValue>(scale_ * (*generator_)());
141 while (!impl::RangePolicy<RT>::isInRange(result, infimum_, supremum_));
150template <
typename T,
typename RandomGenerator>
inline
154 return distribution();
165template <
typename T,
class RG>
179template <
typename T,
class RG>
181 generator_(&generator),
182 rateOfChange_(rateOfChange)
188template <
typename T,
class RG>
inline
190DistributionExponential<T, RG>::operator()()
const
192 LASS_ASSERT(generator_);
196 temp =
static_cast<TValue>((*generator_)()) / TGenerator::max();
198 while (temp == TNumTraits::zero);
199 return -num::log(temp) / rateOfChange_;
207template <
typename T,
typename RandomGenerator>
inline
211 return distribution();
222template <
typename T,
class RG>
236template <
typename T,
class RG>
239 generator_(&generator),
241 standardDeviation_(standardDeviation),
249template <
typename T,
class RG>
inline
251DistributionNormal<T, RG>::operator()()
const
253 LASS_ASSERT(generator_);
258 return mean_ + standardDeviation_ * gset_;
261 const TValue scale =
static_cast<TValue
>(2) / TGenerator::max();
265 v1 = scale * (*generator_)() - TNumTraits::one;
266 v2 = scale * (*generator_)() - TNumTraits::one;
267 rsq = v1 * v1 + v2 * v2;
269 while (rsq >= 1.0 || rsq == 0.0);
270 const TValue fac = num::sqrt(-2 * num::log(rsq) / rsq);
274 return mean_ + standardDeviation_ * v2 * fac;
282template <
typename T,
typename RandomGenerator>
inline
286 return distribution();
296template<
class T,
class RG> T
uniform(RG& generator)
298 return distributeUniform(generator);
318 RG& generator,
typename util::CallTraits<T>::TParam mean,
319 typename util::CallTraits<T>::TParam stddev)
330#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
333# pragma GCC diagnostic pop
util::CallTraits< T >::TParam TParam
parameter value type
RandomGenerator TGenerator
generator type
util::CallTraits< T >::TValue TValue
value type
DistributionExponential()
construct an empty distribution.
T distributeExponential(RandomGenerator &generator, T rateOfChange)
draw a random number from generator and transform it by a exponential distribution
DistributionNormal()
construct an empty distribution.
T distributeNormal(RandomGenerator &generator, T mean, T standardDeviation)
draw a random number from generator and transform it by a normal distribution
util::CallTraits< T >::TValue TValue
value type
util::CallTraits< T >::TParam TParam
parameter value type
RandomGenerator TGenerator
generator type
T gauss(RG &generator, typename util::CallTraits< T >::TParam mean, typename util::CallTraits< T >::TParam stddev)
T unitGauss(RG &generator)
@ rtRightOpen
range is open to the right: [inf, sup)
@ rtClosed
range is closed on both sides: [inf, sup]
@ rtLeftOpen
range is open to the left: (inf, sup]
@ rtOpen
range is open to both sides: (inf, sup)
numeric types and traits.
Library for Assembled Shared Sources.