2 // --- coding: latin_1 ---
5 // creation : 2007-02-21.09.50.46
8 // Copyright © 2007 Commissariat à l'Energie Atomique
9 // par Gilles ARNAUD (DM2S/SFME/LETR)
10 // C.E. Saclay; Bat 454; 91191 GIF/YVETTE CEDEX; France
11 // Tel: 01 69 08 38 86; Fax : 33 1 69 08 85 68
12 // Gilles.Arnaud@cea.fr
17 //___________________________________________________________________
20 #include <sys/types.h>
24 // #include "mt19937ar.h
25 extern void init_by_array(unsigned long [], int);
26 extern double genrand_real1(void);
27 extern double genrand_real3(void);
33 static void initrand(void)
37 31081996, 21012006, 17921963, 0,
38 11101998, 2112003, 25111964, 0
43 vec[3] = vec[7] = 2082007;
45 vec[3] = (unsigned long) getpid();
46 vec[7] = (unsigned long) time(NULL);
48 init_by_array(vec, 8);
53 /*static void initrand(void)
57 31081996, 21012006, 17921963, 0,
58 11101998, 2112003, 25111964, 0
62 vec[3] = (unsigned long) getpid();
63 vec[7] = (unsigned long) time(NULL);
64 init_by_array(vec, 8);
69 static double randGauss(void)
81 next = 2.0*genrand_real3() - 1.0;
82 v2 = 2.0*genrand_real3() - 1.0;
83 d = next*next + v2*v2;
84 } while (d >= 1.0 || d == 0.0);
85 fac = sqrt(-2.0*log(d)/d);
94 Aleatoire::Aleatoire(long sz)
100 void Aleatoire::fill(std::vector<double> &ret)
104 for (i=0; i<size; i++) ret[i] = tire();
107 std::vector<double> *Aleatoire::gen()
109 std::vector<double> *ret;
111 ret = new std::vector<double>(size);
119 return genrand_real1();
122 // class NormalPositif
123 double NormalePositif::tire()
125 return randGauss() * 0.25 + 0.5 ;
129 double Normale::tire()
135 void Sphere::fill(std::vector<double> &ret)
141 for (cum=0, i=0; i<size; i++)
142 cum += ret[i] * ret[i];
144 r = pow(genrand_real1(), size);
145 for (i=0; i<size; i++)
149 // class SpherePositif
150 void SpherePositif::fill(std::vector<double> &ret)
155 for (i=0; i<size; i++)
156 ret[i] = fabs(ret[i]);