From: Yann Duplouy Date: Tue, 12 Nov 2019 10:29:59 +0000 (+0100) Subject: Fixes to xbt::random X-Git-Tag: v3.25~386^2~4 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/61dd4dd6b2ecde25d99a11093aa01ed7ded944b9 Fixes to xbt::random --- diff --git a/include/xbt/random.hpp b/include/xbt/random.hpp index cf2b168c18..3ca1db16e5 100644 --- a/include/xbt/random.hpp +++ b/include/xbt/random.hpp @@ -15,6 +15,7 @@ int uniform_int(int, int); double uniform_real(double, double); double exponential(double); double normal(double, double); +void set_mersenne_seed(int); } // namespace random } // namespace xbt } // namespace simgrid diff --git a/src/xbt/random.cpp b/src/xbt/random.cpp index 03c544a053..46f2a0fcb6 100644 --- a/src/xbt/random.cpp +++ b/src/xbt/random.cpp @@ -42,25 +42,25 @@ double uniform_real(double min, double max) double exponential(double lambda) { - unsigned long numerator = mt19937_gen() - mt19937_gen.min(); - unsigned long divisor = mt19937_gen.max() - mt19937_gen.min(); - return -1 / lambda * log(numerator / divisor); + return -1 / lambda * log(uniform_real(0, 1)); } double normal(double mean, double sd) { - unsigned long numeratorA = mt19937_gen() - mt19937_gen.min(); - unsigned long numeratorB = mt19937_gen() - mt19937_gen.min(); - unsigned long divisor = mt19937_gen.max() - mt19937_gen.min(); - double u1 = numeratorA / divisor; + double u1 = 0; while (u1 < std::numeric_limits::min()) { - numeratorA = mt19937_gen() - mt19937_gen.min(); - u1 = numeratorA / divisor; + u1 = uniform_real(0, 1); } - double z0 = sqrt(-2.0 * log(numeratorA / divisor)) * cos(2 * M_PI * numeratorB / divisor); + double u2 = uniform_real(0, 1); + double z0 = sqrt(-2.0 * log(u1)) * cos(2 * M_PI * u2); return z0 * sd + mean; } +void set_mersenne_seed(int seed) +{ + mt19937_gen.seed(seed); +} + } // namespace random } // namespace xbt } // namespace simgrid