1 #include "surf/random_mgr.h"
2 #include "xbt/sysdep.h"
5 static double drand48(void)
11 static double rand_r(unsigned int* seed)
18 static double custom_random(Generator generator, long int *seed){
24 return (double)rand_r((unsigned int*)seed)/RAND_MAX;
30 /* Generate numbers between min and max with a given mean and standard deviation */
31 double random_generate(random_data_t random) {
33 double alpha, beta, gamma;
34 double U1, U2, V, W, X;
36 if (random == NULL) return 0.0f;
38 a = random->mean * ( random->mean * (1 - random->mean) / (random->std*random->std) - 1 );
39 b = (1 - random->mean) * ( random->mean * (1 - random->mean) / (random->std*random->std) - 1 );
42 if (a <= 1. || b <= 1.)
43 beta = ((1./a)>(1./b))?(1./a):(1./b);
45 beta = sqrt ((alpha-2.) / (2.*a*b - alpha));
49 /* Random generation for the Beta distribution based on
50 * R. C. H. Cheng (1978). Generating beta variates with nonintegral shape parameters. _Communications of the ACM_, *21*, 317-322.
51 * It is good for speed because it does not call math functions many times and respect the 4 given constraints
53 U1 = custom_random(random->generator,&(random->seed));
54 U2 = custom_random(random->generator,&(random->seed));
56 V = beta * log(U1/(1-U1));
58 } while (alpha * log(alpha/(b + W)) + gamma*V - log(4) < log(U1*U1*U2));
62 return X * (random->max - random->min) + random->min;
65 random_data_t random_new(Generator generator, long int seed,
66 double min, double max,
67 double mean, double std){
68 random_data_t random = xbt_new0(s_random_data_t, 1);
70 random->generator = generator;
75 /* Check user stupidities */
77 THROW2(arg_error,0,"random->max < random->min (%f < %f)",max, min);
79 THROW2(arg_error,0,"random->mean < random->min (%f < %f)",mean, min);
81 THROW2(arg_error,0,"random->mean > random->max (%f > %f)",mean, max);
83 /* normalize the mean and standard deviation before storing */
84 random->mean = (mean - min) / (max - min);
85 random->std = std / (max - min);
87 if (random->mean * (1-random->mean) < random->std*random->std)
88 THROW2(arg_error,0,"Invalid mean and standard deviation (%f and %f)",random->mean, random->std);