+double XbtRandom::exponential(double lambda)
+{
+ return -1.0 / lambda * log(uniform_real(0.0, 1.0));
+}
+
+double XbtRandom::normal(double mean, double sd)
+{
+ double u1;
+ do {
+ u1 = uniform_real(0.0, 1.0);
+ } while (u1 < std::numeric_limits<double>::min());
+ 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;
+}
+
+static std::unique_ptr<Random> default_random(new XbtRandom);
+
+void set_implem_xbt()
+{
+ default_random.reset(new XbtRandom);
+}
+void set_implem_std()
+{
+ default_random.reset(new StdRandom);
+}
+
+void set_mersenne_seed(int seed)
+{
+ default_random->set_seed(seed);
+}
+
+int uniform_int(int min, int max)
+{
+ return default_random->uniform_int(min, max);
+}
+
+double uniform_real(double min, double max)