35 #ifndef AIMS_MATH_RANDOM_H
36 #define AIMS_MATH_RANDOM_H
60 const std::complex<float> &
max);
63 const std::complex<double> &
max);
74 const std::complex<float> &sigma);
77 const std::complex<double> &sigma);
83 template <
class T>
class VolumeRef;
92 template <
class T>
inline
143 template <
class T>
inline
145 {
return((T)((
double)mean + (
double)sigma *
NormalRandom()));
176 T
ran0(
int *idum=NULL );
186 T
ran1(
int *idum=NULL );
196 T
ran2(
int *idum=NULL );
203 T
ran3(
int *idum=NULL );
207 template<
class T >
inline
216 srand( time( NULL ) );
223 idumm = 16807 * ( idumm - k * 127773 ) - 2836 * k;
225 if ( idumm < 0 ) idumm += 2147483647;
227 ans = (T)( ( 1.0 / 2147483647 ) * idumm );
230 if ( idum ) *idum = idumm;
236 template<
class T >
inline
247 srand( time( NULL ) );
252 if ( idumm <= 0 || !iy )
254 if ( -idumm < 1 ) idumm = 1;
257 for ( j=39; j>=0; j-- )
260 idumm = 16807 * ( idumm - k * 127773 ) - 2836 * k;
262 if ( idumm < 0 ) idumm += 2147483647;
263 if ( j < 32 ) iv[ j ] = idumm;
270 idumm = 16807 * ( idumm - k * 127773 ) - 2836 * k;
272 if ( idumm < 0 ) idumm += 2147483647;
274 j = iy / ( 1 + 2147483646 / 32 );
278 if ( idum ) *idum = idumm;
280 if ( ( temp = (T)( 1.0 * iy / 2147483647 ) ) > (T)( 1.0 - 1.2e-7 ) )
281 return (T)( 1.0 - 1.2e-7 );
286 template<
class T >
inline
291 static int idum2 = 123456789;
298 srand( time( NULL ) );
305 if ( -idumm < 1 ) idumm = 1;
310 for ( j = 39; j>=0; j-- )
313 idumm = 40014 * ( idumm - k * 53668 ) - k * 12211;
315 if ( idumm < 0 ) idumm += 2147483563;
316 if ( j < 32 ) iv[ j ] = idumm;
323 idumm = 40014 * ( idumm - k * 53668 ) - k * 12211;
325 if ( idumm < 0 ) idumm += 2147483563;
328 idum2 = 40692 * ( idum2 - k * 52774 ) - k * 3791;
330 if ( idum2 < 0 ) idum2 += 2147483399;
332 j = iy / ( 1 + 2147483562 / 32 );
333 iy = iv[ j ] - idum2;
335 if ( iy < 1 ) iy += 2147483562;
337 if ( idum ) *idum = idumm;
339 if ( ( temp = (T)( 1.0 * iy / 2147483563 ) ) > (T)( 1.0 - 1.2e-7 ) )
340 return (T)( 1.0 - 1.2e-7 );
345 template<
class T >
inline
348 static int inext, inextp;
356 srand( time( NULL ) );
361 if ( idumm < 0 || iff == 0 )
364 mj = 161803398 - ( idumm < 0 ? -idumm : idumm );
369 for ( i=1; i<=54; i++ )
371 ii = ( 21 * i ) % 55;
374 if ( mk < 0 ) mk += 1000000000;
378 for ( k=1; k<=4; k++ )
379 for ( i=1; i<=55; i++ )
381 ma[ i ] -= ma[ 1 + ( i + 30 ) % 55 ];
383 if ( ma[ i ] < 0 ) ma[ i ] += 1000000000;
391 if ( ++inext == 56 ) inext = 1;
392 if ( ++inextp == 56 ) inextp = 1;
394 mj = ma[ inext ] - ma[ inextp ];
396 if ( mj < 0 ) mj += 1000000000;
400 if ( idum ) *idum = idumm;
402 return (T)( 1.0 * mj / 1000000000 );
426 T
doit(
int *idum=NULL );
430 template<
class T >
inline
436 do dum = udev.
ran1( idum );
437 while ( dum == (T)0 );
439 return (T)( -log( (
double)dum ) );
463 T
doit(
int *idum=NULL );
467 template<
class T >
inline
479 v1 = (T)( 2.0 * udev.
ran1( idum ) - 1.0 );
480 v2 = (T)( 2.0 * udev.
ran1( idum ) - 1.0 );
481 rsq = v1 * v1 + v2 * v2;
483 while ( rsq >= (T)1 || rsq == (T)0 );
485 fac = (T)sqrt( -2.0 * log( (
double)rsq ) / rsq );
Exponential random numbers.
T doit(int *idum=NULL)
Exponential random number generator.
ExponentialDeviates()
Constructor and destructor.
virtual ~ExponentialDeviates()
destructor
NormalDeviates()
Constructors and destructors.
virtual ~NormalDeviates()
destructor
T doit(int *idum=NULL)
Normal random numbers generator.
float min(float x, float y)
float max(float x, float y)
double NormalRandom()
Normal gaussian distribution with mean = 0.0 and sigma = 1.0.
carto::VolumeRef< int > AimsRandomList(int size)
generate a random list of int between 0 and (size-1)
T GaussianRandom(const T &mean, const T &sigma)
generate gaussian random number with mean,sigma
double UniformRandom()
Uniform distribution between 0.0 and 1.0.