1 /* Copyright (c) 2019-2020. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #include "xbt/random.hpp"
7 #include "xbt/asserts.h"
16 int StdRandom::uniform_int(int min, int max)
18 std::uniform_int_distribution<> dist(min, max);
19 return dist(mt19937_gen);
22 double StdRandom::uniform_real(double min, double max)
24 std::uniform_real_distribution<> dist(min, max);
25 return dist(mt19937_gen);
28 double StdRandom::exponential(double lambda)
30 std::exponential_distribution<> dist(lambda);
31 return dist(mt19937_gen);
34 double StdRandom::normal(double mean, double sd)
36 std::normal_distribution<> dist(mean, sd);
37 return dist(mt19937_gen);
40 int XbtRandom::uniform_int(int min, int max)
42 unsigned long range = max - min + 1;
43 xbt_assert(min <= max,
44 "The minimum value for the uniform integer distribution must not be greater than the maximum value");
45 xbt_assert(range > 0, "Overflow in the uniform integer distribution, please use a smaller range.");
48 value = mt19937_gen();
49 } while (value >= decltype(mt19937_gen)::max() - decltype(mt19937_gen)::max() % range);
50 return value % range + min;
53 double XbtRandom::uniform_real(double min, double max)
55 // This reuses Boost's uniform real distribution ideas
56 constexpr unsigned long divisor = decltype(mt19937_gen)::max() - decltype(mt19937_gen)::min();
57 unsigned long numerator;
59 numerator = mt19937_gen() - decltype(mt19937_gen)::min();
60 } while (numerator == divisor);
61 return min + (max - min) * numerator / divisor;
64 double XbtRandom::exponential(double lambda)
66 return -1.0 / lambda * log(uniform_real(0.0, 1.0));
69 double XbtRandom::normal(double mean, double sd)
73 u1 = uniform_real(0.0, 1.0);
74 } while (u1 < std::numeric_limits<double>::min());
75 double u2 = uniform_real(0.0, 1.0);
76 double z0 = sqrt(-2.0 * log(u1)) * cos(2.0 * M_PI * u2);
77 return z0 * sd + mean;
80 static std::unique_ptr<Random> default_random(new XbtRandom);
84 default_random.reset(new XbtRandom);
88 default_random.reset(new StdRandom);
91 void set_mersenne_seed(int seed)
93 default_random->set_seed(seed);
96 void read_mersenne_state(std::string filename)
98 default_random->read_state(filename);
101 void write_mersenne_state(std::string filename)
103 default_random->write_state(filename);
106 int uniform_int(int min, int max)
108 return default_random->uniform_int(min, max);
111 double uniform_real(double min, double max)
113 return default_random->uniform_real(min, max);
116 double exponential(double lambda)
118 return default_random->exponential(lambda);
121 double normal(double mean, double sd)
123 return default_random->normal(mean, sd);
126 } // namespace random
128 } // namespace simgrid