33 #ifndef __INCLUDE_MIST_RANDOM__
34 #define __INCLUDE_MIST_RANDOM__
38 #ifndef __INCLUDE_MIST_H__
42 #ifndef __INCLUDE_MIST_MATRIX__
61 static const unsigned long n = 624;
62 static const unsigned long m = 397;
63 static const unsigned long vec_a = 0x9908b0df
UL;
64 static const unsigned long upper = 0x80000000
UL;
65 static const unsigned long lower = 0x7fffffff
UL;
66 static const double pai_timed_by_2 = 6.283185307179586;
100 random( ) : vec_( __random__::n ), i_( __random__::n + 1 )
111 explicit random(
const unsigned long seed ) : vec_( __random__::n ), i_( __random__::n + 1 )
135 void init(
const unsigned long& seed )
137 vec_[ 0 ] = seed & 0xffffffff
UL;
139 for( i_ = 1 ; i_ < __random__::n ; i_ ++ )
141 vec_[ i_ ] = ( 1812433253UL * ( vec_[ i_ - 1 ] ^ ( vec_[ i_ - 1 ] >> 30 ) ) + i_ );
146 vec_[ i_ ] &= 0xffffffff
UL;
162 unsigned long i, j, k;
167 for( k = ( __random__::n > seed_array.
size( ) ? __random__::n :
static_cast< unsigned long >( seed_array.
size( ) ) ) ; k > 0 ; k -- )
169 vec_[ i ] = ( vec_[ i ] ^ ( ( vec_[ i - 1 ] ^ ( vec_[ i - 1 ] >> 30 ) ) * 1664525
UL ) ) + seed_array[ j ] + j;
170 vec_[ i ] &= 0xffffffff
UL;
174 if( i >= __random__::n )
176 vec_[ 0 ] = vec_[ __random__::n - 1 ];
180 if( j >= seed_array.
size( ) )
186 for( k = __random__::n - 1 ; k > 0 ; k -- )
188 vec_[ i ] = ( vec_[ i ] ^ ( ( vec_[ i - 1 ] ^ ( vec_[ i - 1 ] >> 30 ) ) * 1566083941
UL ) ) - i;
189 vec_[ i ] &= 0xffffffff
UL;
192 if( i >= __random__::n )
194 vec_[ 0 ] = vec_[ __random__::n - 1 ];
199 vec_[ 0 ] = 0x80000000
UL;
208 unsigned long int32( )
211 static unsigned long mag01[ 2 ] = { 0x0
UL, __random__::vec_a };
214 if( i_ >= __random__::n )
218 if( i_ == __random__::n + 1 )
222 for( kk = 0 ; kk < __random__::n - __random__::m ; kk ++ )
224 y = ( vec_[ kk ] & __random__::upper ) | ( vec_[ kk + 1 ] & __random__::lower );
225 vec_[ kk ] = vec_[ kk + __random__::m ] ^ ( y >> 1 ) ^ mag01[ y & 0x1UL ];
228 for( ; kk < __random__::n - 1 ; kk ++ )
230 y = ( vec_[ kk ] & __random__::upper ) | ( vec_[ kk + 1 ] & __random__::lower );
231 vec_[ kk ] = vec_[ kk + ( __random__::m - __random__::n ) ] ^ ( y >> 1 ) ^ mag01[ y & 0x1
UL ];
234 y = ( vec_[ __random__::n - 1 ] & __random__::upper ) | ( vec_[ 0 ] & __random__::lower );
235 vec_[ __random__::n - 1 ] = vec_[ __random__::m - 1 ] ^ ( y >> 1 ) ^ mag01[ y & 0x1UL ];
244 y ^= ( y << 7 ) & 0x9d2c5680UL;
245 y ^= ( y << 15 ) & 0xefc60000UL;
258 unsigned long int31( )
260 return ( int32( ) >> 1 );
272 return ( int32( ) * ( 1.0 / 4294967295.0 ) );
285 return ( int32( ) * ( 1.0 / 4294967296.0 ) );
298 return ( ( (
double ) int32( ) ) + 0.5 ) * ( 1.0 / 4294967296.0 );
311 const unsigned long a = int32( ) >> 5;
312 const unsigned long b = int32( ) >> 6;
314 return ( ( a * 67108864.0 + b ) * ( 1.0 / 9007199254740992.0 ) );
324 unsigned long generate(
const unsigned int n = 0xffffffffUL )
326 return ( static_cast< unsigned long >( real2( ) * n ) );
336 unsigned long operator( )(
const unsigned int n = 0xffffffff
UL )
338 return generate( n );
359 double standard_deviation_;
368 standard_deviation_( 1.0 )
380 standard_deviation_( std::sqrt( variance ) )
390 random(
const unsigned long seed,
const double mean = 0.0,
const double variance = 1.0 ) :
393 standard_deviation_( std::sqrt(
variance ) )
404 u_rand_( seed_array ),
406 standard_deviation_( std::sqrt(
variance ) )
416 void init(
const unsigned long& seed )
418 u_rand_.init( seed );
432 u_rand_.init( seed_array );
440 void set_param(
const double& mean = 0.0,
const double&
variance = 1.0 )
443 standard_deviation_ = std::sqrt(
variance );
452 return( standard_deviation_ * std::sqrt( -2.0 * std::log( 1.0 - u_rand_.real2( ) ) ) * std::cos( __random__::pai_timed_by_2 * ( 1.0 - u_rand_.real2( ) ) ) + mean_ );
459 double operator( )( )
489 lambda_exp_( std::exp( 1.0 ) )
499 lambda_exp_( std::exp( lambda ) )
508 random(
const unsigned long seed,
const double lambda = 1.0 ) :
510 lambda_exp_( std::exp( lambda ) )
520 u_rand_( seed_array ),
521 lambda_exp_( std::exp( lambda ) )
531 void init(
const unsigned long& seed )
533 u_rand_.init( seed );
547 u_rand_.init( seed_array );
554 void set_param(
const double lambda = 1.0 )
556 lambda_exp_ = std::exp( lambda );
566 double lambda = lambda_exp_ * u_rand_.real2( );
567 for( ; lambda > 1.0 ; k++ )
569 lambda *= u_rand_.real2( );
580 int generate(
double l )
583 double lambda = std::exp( l ) * u_rand_.real2( );
584 for( ; lambda > 1.0 ; k++ )
586 lambda *= u_rand_.real2( );
597 return( generate( ) );
606 int operator( )(
double l )
608 return( generate( l ) );
616 namespace multivariate_gauss
634 size_t i, j, m, k = mat1.
cols( );
636 mat2( 0, 0 ) = std::sqrt( mat1( 0, 0 ) );
638 for( i = 0 ; i < k ; i ++ )
640 mat2( i, 0 ) = mat1( i, 0 ) / mat2( 0, 0 );
643 for( i = 1 ; i < k ; i ++ )
646 for( j = 0 ; j < i ; j ++ )
648 s += mat2( i, j ) * mat2( i, j );
651 mat2( i, i ) = sqrt( mat1( i, i ) - s );
652 for( j = 1 ; j < i ; j ++ )
655 for( m = 0 ; m < j ; m ++ )
657 s += mat2( i, m ) * mat2( j, m );
659 mat2( i, j ) = ( mat1( i, j ) - s ) / mat2( j, j );
673 mean_(
matrix< double >( ) ),
674 l_triangle_(
matrix< double >( ) )
686 l_triangle_( choleski( covariance ) )
699 l_triangle_( choleski( covariance ) )
710 g_rand_( seed_array ),
712 l_triangle_( choleski( covariance ) )
722 void init(
const unsigned long& seed )
724 g_rand_.init( seed );
735 l_triangle_ = choleski( covariance );
745 for(
size_t i = 0 ; i < r_vec.size( ) ; i ++ )
747 r_vec[ i ] = g_rand_.generate( );
749 return( mean_ + l_triangle_ * r_vec );
810 #endif // __INCLUDE_MIST_RANDOM__