From 73e3cdfbdbcdf5fb1d501f09985886c0552989d5 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 6 Feb 2020 11:07:52 +0100 Subject: [PATCH] Cosmetics in xbt/random. --- include/xbt/random.hpp | 5 +++++ src/xbt/random.cpp | 27 +++++++++++++-------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/include/xbt/random.hpp b/include/xbt/random.hpp index 4da604fc5c..b67487d623 100644 --- a/include/xbt/random.hpp +++ b/include/xbt/random.hpp @@ -14,10 +14,12 @@ namespace random { * @brief Tells xbt/random to use the ad-hoc distribution implementation. */ void set_implem_xbt(); + /** * @brief Tells xbt/random to use the standard library distribution implementation. */ void set_implem_std(); + /** * @brief Sets the seed of the Mersenne-Twister RNG */ @@ -30,6 +32,7 @@ void set_mersenne_seed(int); * @param max Maximum value */ int uniform_int(int min, int max); + /** * @brief Draws a real number uniformly between min and max included * @@ -37,12 +40,14 @@ int uniform_int(int min, int max); * @param max Maximum value */ double uniform_real(double min, double max); + /** * @brief Draws a real number according to the given exponential distribution * * @param lambda Parameter of the exponential law */ double exponential(double lambda); + /** * @brief Draws a real number according to the given normal distribution * diff --git a/src/xbt/random.cpp b/src/xbt/random.cpp index 79bc21b343..beaaf21329 100644 --- a/src/xbt/random.cpp +++ b/src/xbt/random.cpp @@ -34,15 +34,14 @@ int uniform_int(int min, int max) if (rng_implem == XBT_RNG_std) { std::uniform_int_distribution<> dist(min, max); return dist(mt19937_gen); - } + } unsigned long range = max - min + 1; unsigned long value = mt19937_gen(); + xbt_assert(min <= max, + "The minimum value for the uniform integer distribution must not be greater than the maximum value"); xbt_assert(range > 0, "Overflow in the uniform integer distribution, please use a smaller range."); - xbt_assert( - min <= max, - "The maximum value for the uniform integer distribution must be greater than or equal to the minimum value"); - while (value >= mt19937_gen.max() - mt19937_gen.max() % range) { + while (value >= decltype(mt19937_gen)::max() - decltype(mt19937_gen)::max() % range) { value = mt19937_gen(); } return value % range + min; @@ -53,11 +52,11 @@ double uniform_real(double min, double max) if (rng_implem == XBT_RNG_std) { std::uniform_real_distribution<> dist(min, max); return dist(mt19937_gen); - } + } // This reuses Boost's uniform real distribution ideas - unsigned long numerator = mt19937_gen() - mt19937_gen.min(); - unsigned long divisor = mt19937_gen.max() - mt19937_gen.min(); + constexpr unsigned long divisor = decltype(mt19937_gen)::max() - decltype(mt19937_gen)::min(); + unsigned long numerator = mt19937_gen() - decltype(mt19937_gen)::min(); return min + (max - min) * numerator / divisor; } @@ -66,9 +65,9 @@ double exponential(double lambda) if (rng_implem == XBT_RNG_std) { std::exponential_distribution<> dist(lambda); return dist(mt19937_gen); - } + } - return -1 / lambda * log(uniform_real(0, 1)); + return -1.0 / lambda * log(uniform_real(0.0, 1.0)); } double normal(double mean, double sd) @@ -78,12 +77,12 @@ double normal(double mean, double sd) return dist(mt19937_gen); } - double u1 = 0; + double u1 = 0.0; while (u1 < std::numeric_limits::min()) { - u1 = uniform_real(0, 1); + u1 = uniform_real(0.0, 1.0); } - double u2 = uniform_real(0, 1); - double z0 = sqrt(-2.0 * log(u1)) * cos(2 * M_PI * u2); + double u2 = uniform_real(0.0, 1.0); + double z0 = sqrt(-2.0 * log(u1)) * cos(2.0 * M_PI * u2); return z0 * sd + mean; } -- 2.20.1