Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00054 #include "fvar.hpp"
00055
00056 #define N 624
00057 #define M 397
00058 #define MATRIX_A 0x9908b0dfUL
00059 #define UPPER_MASK 0x80000000UL
00060 #define LOWER_MASK 0x7fffffffUL
00061
00070 random_number_generator::random_number_generator(int seed)
00071 {
00072 unsigned long s=seed;
00073 mt=new unsigned long [N];
00074 mti=N+1;
00075
00076 mt[0]= s & 0xffffffffUL;
00077 for (mti=1; mti<N; mti++) {
00078 mt[mti] = (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
00079
00080
00081
00082
00083 mt[mti] &= 0xffffffffUL;
00084
00085 }
00086 better_rand();
00087 }
00088
00093 random_number_generator::~random_number_generator()
00094 {
00095 delete [] mt;
00096 mt=0;
00097 }
00098
00107 void random_number_generator::reinitialize(int seed)
00108 {
00109 unsigned long s=seed;
00110 mt[0]= s & 0xffffffffUL;
00111 for (mti=1; mti<N; mti++) {
00112 mt[mti] =
00113 (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
00114
00115
00116
00117
00118 mt[mti] &= 0xffffffffUL;
00119
00120 }
00121 better_rand();
00122 }
00123
00136 double random_number_generator::better_rand()
00137 {
00138 unsigned long y;
00139 static unsigned long mag01[2]={0x0UL, MATRIX_A};
00140
00141
00142 if (mti >= N) {
00143 int kk;
00144
00145
00146
00147
00148 for (kk=0;kk<N-M;kk++) {
00149 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
00150 mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
00151 }
00152 for (;kk<N-1;kk++) {
00153 y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
00154 mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
00155 }
00156 y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
00157 mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
00158
00159 mti = 0;
00160 }
00161
00162 y = mt[mti++];
00163
00164
00165 y ^= (y >> 11);
00166 y ^= (y << 7) & 0x9d2c5680UL;
00167 y ^= (y << 15) & 0xefc60000UL;
00168 y ^= (y >> 18);
00169
00170 return (((double)y) + 0.5)*(1.0/4294967296.0);
00171 }
00172
00173 #undef N
00174 #undef M
00175 #undef MATRIX_A
00176 #undef UPPER_MASK
00177 #undef LOWER_MASK
00178
00185 double randn(const random_number_generator& rng)
00186 {
00187 double x,y;
00188 x=((random_number_generator&) rng).better_rand();
00189 y=((random_number_generator&) rng).better_rand();
00190 double u=sqrt(-2*log(x))*cos(2*PI*y);
00191 return(u);
00192 }
00193
00201 double randu(const random_number_generator& rng)
00202 {
00203 double x;
00204 x=((random_number_generator&) rng).better_rand();
00205 return(x);
00206 }
00207
00212 void dvector::fill_randbi(double p, const random_number_generator& rng)
00213 {
00214 if ( p<0 || p>1)
00215 {
00216 cerr << "Error in dvar_vector::fill_randbi proportions of"
00217 " successes must lie between 0 and 1\n";
00218 ad_exit(1);
00219 }
00220 for (int i=indexmin(); i<=indexmax(); i++)
00221 {
00222 if ( ((random_number_generator&) rng).better_rand()<=p)
00223 {
00224 elem(i)=1;
00225 }
00226 else
00227 {
00228 elem(i)=0;
00229 }
00230 }
00231 }
00232
00237 void dvector::fill_randu(const random_number_generator& rng)
00238 {
00239 for (int i=indexmin(); i<=indexmax(); i++)
00240 {
00241 elem(i)=((random_number_generator&) rng).better_rand();
00242 }
00243 }
00244
00249 void dmatrix::colfill_randu(const int&j, const random_number_generator& rng)
00250 {
00251 for (int i=rowmin(); i<=rowmax(); i++)
00252 {
00253 elem(i,j)=((random_number_generator&) rng).better_rand();
00254 }
00255 }
00256
00261 void dmatrix::rowfill_randu(const int& i, const random_number_generator& rng)
00262 {
00263 for (int j=colmin(); j<=colmax(); j++)
00264 {
00265 elem(i,j)=((random_number_generator&) rng).better_rand();
00266 }
00267 }
00268
00273 void dvector::fill_randn(const random_number_generator& rng)
00274 {
00275 for (int i=indexmin(); i<=indexmax(); i++)
00276 {
00277 (*this)(i)=randn(rng);
00278 }
00279 }
00280
00285 void dmatrix::fill_randn(const random_number_generator& rng)
00286 {
00287 for (int i=rowmin(); i<=rowmax(); i++)
00288 {
00289 elem(i).fill_randn(rng);
00290 }
00291 }
00292
00297 void d3_array::fill_randn(const random_number_generator& rng)
00298 {
00299 for (int i=slicemin(); i<=slicemax(); i++)
00300 {
00301 elem(i).fill_randn(rng);
00302 }
00303 }
00304
00309 void d3_array::fill_randu(const random_number_generator& rng)
00310 {
00311 for (int i=slicemin(); i<=slicemax(); i++)
00312 {
00313 elem(i).fill_randu(rng);
00314 }
00315 }
00316
00321 void dmatrix::fill_randu(const random_number_generator& rng)
00322 {
00323 for (int i=rowmin(); i<=rowmax(); i++)
00324 {
00325 elem(i).fill_randu(rng);
00326 }
00327 }
00328
00333 void dmatrix::colfill_randn(const int&j, const random_number_generator& rng)
00334 {
00335 for (int i=rowmin(); i<=rowmax(); i++)
00336 {
00337 elem(i,j)=randn(rng);
00338 }
00339 }
00340
00345 void dmatrix::rowfill_randn(const int& i, const random_number_generator& rng)
00346 {
00347 for (int j=colmin(); j<=colmax(); j++)
00348 {
00349 elem(i,j)=randn(rng);
00350 }
00351 }