35 #ifndef AIMS_MATH_RANDOM_H 36 #define AIMS_MATH_RANDOM_H 60 const std::complex<float> &
max);
63 const std::complex<double> &
max);
73 std::complex<float>
GaussianRandom(
const std::complex<float> &mean,
74 const std::complex<float> &sigma);
76 std::complex<double>
GaussianRandom(
const std::complex<double> &mean,
77 const std::complex<double> &sigma);
89 template <
class T>
inline 91 {
return((T) ((
double)min+(
double)(max-min)*(
double)
UniformRandom()));
106 return min + (
unsigned short)(
UniformRandom() * (max-min+0.99999) );
121 return min + (
unsigned int)(
UniformRandom() * (max-min+0.99999) );
136 return min + (
unsigned long)(
UniformRandom() * (max-min+0.99999) );
140 template <
class T>
inline 142 {
return((T)((
double)mean + (
double)sigma *
NormalRandom()));
173 T
ran0(
int *idum=NULL );
183 T
ran1(
int *idum=NULL );
193 T
ran2(
int *idum=NULL );
200 T
ran3(
int *idum=NULL );
204 template<
class T >
inline 213 srand( time( NULL ) );
220 idumm = 16807 * ( idumm - k * 127773 ) - 2836 * k;
222 if ( idumm < 0 ) idumm += 2147483647;
224 ans = (T)( ( 1.0 / 2147483647 ) * idumm );
227 if ( idum ) *idum = idumm;
233 template<
class T >
inline 244 srand( time( NULL ) );
249 if ( idumm <= 0 || !iy )
251 if ( -idumm < 1 ) idumm = 1;
254 for ( j=39; j>=0; j-- )
257 idumm = 16807 * ( idumm - k * 127773 ) - 2836 * k;
259 if ( idumm < 0 ) idumm += 2147483647;
260 if ( j < 32 ) iv[ j ] = idumm;
267 idumm = 16807 * ( idumm - k * 127773 ) - 2836 * k;
269 if ( idumm < 0 ) idumm += 2147483647;
271 j = iy / ( 1 + 2147483646 / 32 );
275 if ( idum ) *idum = idumm;
277 if ( ( temp = (T)( 1.0 * iy / 2147483647 ) ) > (T)( 1.0 - 1.2e-7 ) )
278 return (T)( 1.0 - 1.2e-7 );
283 template<
class T >
inline 288 static int idum2 = 123456789;
295 srand( time( NULL ) );
302 if ( -idumm < 1 ) idumm = 1;
307 for ( j = 39; j>=0; j-- )
310 idumm = 40014 * ( idumm - k * 53668 ) - k * 12211;
312 if ( idumm < 0 ) idumm += 2147483563;
313 if ( j < 32 ) iv[ j ] = idumm;
320 idumm = 40014 * ( idumm - k * 53668 ) - k * 12211;
322 if ( idumm < 0 ) idumm += 2147483563;
325 idum2 = 40692 * ( idum2 - k * 52774 ) - k * 3791;
327 if ( idum2 < 0 ) idum2 += 2147483399;
329 j = iy / ( 1 + 2147483562 / 32 );
330 iy = iv[ j ] - idum2;
332 if ( iy < 1 ) iy += 2147483562;
334 if ( idum ) *idum = idumm;
336 if ( ( temp = (T)( 1.0 * iy / 2147483563 ) ) > (T)( 1.0 - 1.2e-7 ) )
337 return (T)( 1.0 - 1.2e-7 );
342 template<
class T >
inline 345 static int inext, inextp;
353 srand( time( NULL ) );
358 if ( idumm < 0 || iff == 0 )
361 mj = 161803398 - ( idumm < 0 ? -idumm : idumm );
366 for ( i=1; i<=54; i++ )
368 ii = ( 21 * i ) % 55;
371 if ( mk < 0 ) mk += 1000000000;
375 for ( k=1; k<=4; k++ )
376 for ( i=1; i<=55; i++ )
378 ma[ i ] -= ma[ 1 + ( i + 30 ) % 55 ];
380 if ( ma[ i ] < 0 ) ma[ i ] += 1000000000;
388 if ( ++inext == 56 ) inext = 1;
389 if ( ++inextp == 56 ) inextp = 1;
391 mj = ma[ inext ] - ma[ inextp ];
393 if ( mj < 0 ) mj += 1000000000;
397 if ( idum ) *idum = idumm;
399 return (T)( 1.0 * mj / 1000000000 );
423 T doit(
int *idum=NULL );
427 template<
class T >
inline 433 do dum = udev.
ran1( idum );
434 while ( dum == (T)0 );
436 return (T)( -log( (
double)dum ) );
460 T doit(
int *idum=NULL );
464 template<
class T >
inline 476 v1 = (T)( 2.0 * udev.
ran1( idum ) - 1.0 );
477 v2 = (T)( 2.0 * udev.
ran1( idum ) - 1.0 );
478 rsq = v1 * v1 + v2 * v2;
480 while ( rsq >= (T)1 || rsq == (T)0 );
482 fac = (T)sqrt( -2.0 * log( (
double)rsq ) / rsq );
float min(float x, float y)
Exponential random numbers.
float max(float x, float y)
double NormalRandom()
Normal gaussian distribution with mean = 0.0 and sigma = 1.0.
T GaussianRandom(const T &mean, const T &sigma)
generate gaussian random number with mean,sigma
T doit(int *idum=NULL)
Normal random numbers generator.
double UniformRandom()
Uniform distribution between 0.0 and 1.0.
virtual ~ExponentialDeviates()
destructor
AimsData< int > AimsRandomList(int size)
generate a random list of int between 0 and (size-1)
T doit(int *idum=NULL)
Exponential random number generator.
virtual ~NormalDeviates()
destructor