22 #ifndef _BLAZE_UTIL_RANDOM_H_
23 #define _BLAZE_UTIL_RANDOM_H_
32 #include <boost/random/uniform_int.hpp>
33 #include <boost/random/uniform_real.hpp>
34 #include <boost/random/uniform_smallint.hpp>
50 template<
typename >
class Rand;
125 template<
typename Type >
139 template<
typename T >
friend class Rand;
177 template<
typename T >
208 template<
typename T >
229 template<
typename T >
233 boost::uniform_smallint<T> dist( min, max );
248 template<
typename T >
269 template<
typename T >
272 value = generate( min, max );
308 inline void randomize(
float& value )
const;
327 boost::uniform_real<float> dist( 0.0, 1.0 );
328 return dist( Random<RNG>::rng_ );
350 boost::uniform_real<float> dist( min, max );
351 return dist( Random<RNG>::rng_ );
390 value = generate( min, max );
427 inline void randomize(
double& value )
const;
446 boost::uniform_real<double> dist( 0.0, 1.0 );
447 return dist( Random<RNG>::rng_ );
469 boost::uniform_real<double> dist( min, max );
470 return dist( Random<RNG>::rng_ );
509 value = generate( min, max );
532 class Rand<long double>
538 inline long double generate()
const;
539 inline long double generate(
long double min,
long double max )
const;
546 inline void randomize(
long double& value )
const;
547 inline void randomize(
long double& value,
long double min,
long double max )
const;
565 boost::uniform_real<long double> dist( 0.0, 1.0 );
566 return dist( Random<RNG>::rng_ );
588 boost::uniform_real<long double> dist( min, max );
589 return dist( Random<RNG>::rng_ );
628 value = generate( min, max );
649 template<
typename T >
650 class Rand< complex<T> >
656 inline const complex<T>
generate()
const;
657 inline const complex<T>
generate(
const T&
min,
const T&
max )
const;
658 inline const complex<T>
generate(
const T& realmin,
const T& realmax,
659 const T& imagmin,
const T& imagmax )
const;
666 inline void randomize( complex<T>& value )
const;
667 inline void randomize( complex<T>& value,
const T&
min,
const T&
max )
const;
668 inline void randomize( complex<T>& value,
const T& realmin,
const T& realmax,
669 const T& imagmin,
const T& imagmax )
const;
686 template<
typename T >
687 inline const complex<T> Rand< complex<T> >::generate()
const
690 return complex<T>( tmp.generate(), tmp.generate() );
710 template<
typename T >
711 inline const complex<T> Rand< complex<T> >::generate(
const T&
min,
const T&
max )
const
714 return complex<T>( tmp.generate( min, max ), tmp.generate( min, max ) );
737 template<
typename T >
738 inline const complex<T> Rand< complex<T> >::generate(
const T& realmin,
const T& realmax,
739 const T& imagmin,
const T& imagmax )
const
742 return complex<T>( tmp.generate( realmin, realmax ), tmp.generate( imagmin, imagmax ) );
758 template<
typename T >
759 inline void Rand< complex<T> >
::randomize( complex<T>& value )
const
782 template<
typename T >
783 inline void Rand< complex<T> >
::randomize( complex<T>& value,
const T& min,
const T& max )
const
785 value = generate( min, max );
810 template<
typename T >
811 inline void Rand< complex<T> >
::randomize( complex<T>& value,
const T& realmin,
const T& realmax,
812 const T& imagmin,
const T& imagmax )
const
814 value = generate( realmin, realmax, imagmin, imagmax );
831 template<
typename T >
834 template<
typename T,
typename A1 >
835 inline T
rand(
const A1& a1 );
837 template<
typename T,
typename A1,
typename A2 >
838 inline T
rand(
const A1& a1,
const A2& a2 );
840 template<
typename T,
typename A1,
typename A2,
typename A3 >
841 inline T
rand(
const A1& a1,
const A2& a2,
const A3& a3 );
843 template<
typename T,
typename A1,
typename A2,
typename A3,
typename A4 >
844 inline T
rand(
const A1& a1,
const A2& a2,
const A3& a3,
const A4& a4 );
846 template<
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
847 inline T
rand(
const A1& a1,
const A2& a2,
const A3& a3,
const A4& a4,
const A5& a5 );
849 template<
typename T >
852 template<
typename T,
typename A1 >
853 inline void randomize( T& value,
const A1& a1 );
855 template<
typename T,
typename A1,
typename A2 >
856 inline void randomize( T& value,
const A1& a1,
const A2& a2 );
858 template<
typename T,
typename A1,
typename A2,
typename A3 >
859 inline void randomize( T& value,
const A1& a1,
const A2& a2,
const A3& a3 );
861 template<
typename T,
typename A1,
typename A2,
typename A3,
typename A4 >
862 inline void randomize( T& value,
const A1& a1,
const A2& a2,
const A3& a3,
const A4& a4 );
864 template<
typename T,
typename A1,
typename A2,
typename A3,
typename A4,
typename A5 >
865 inline void randomize( T& value,
const A1& a1,
const A2& a2,
const A3& a3,
const A4& a4,
const A5& a5 );
868 inline void setSeed( uint32_t seed );
887 template<
typename T >
891 return tmp.generate();
910 return tmp.generate( a1 );
928 inline T
rand(
const A1& a1,
const A2& a2 )
931 return tmp.generate( a1, a2 );
952 inline T
rand(
const A1& a1,
const A2& a2,
const A3& a3 )
955 return tmp.generate( a1, a2, a3 );
978 inline T
rand(
const A1& a1,
const A2& a2,
const A3& a3,
const A4& a4 )
981 return tmp.generate( a1, a2, a3, a4 );
1000 template<
typename T
1006 inline T
rand(
const A1& a1,
const A2& a2,
const A3& a3,
const A4& a4,
const A5& a5 )
1009 return tmp.generate( a1, a2, a3, a4, a5 );
1029 template<
typename T >
1033 tmp.randomize( value );
1048 template<
typename T
1053 tmp.randomize( value, a1 );
1070 template<
typename T
1073 inline void randomize( T& value,
const A1& a1,
const A2& a2 )
1076 tmp.randomize( value, a1, a2 );
1094 template<
typename T
1098 inline void randomize( T& value,
const A1& a1,
const A2& a2,
const A3& a3 )
1101 tmp.randomize( value, a1, a2, a3 );
1120 template<
typename T
1125 inline void randomize( T& value,
const A1& a1,
const A2& a2,
const A3& a3,
const A4& a4 )
1128 tmp.randomize( value, a1, a2, a3, a4 );
1148 template<
typename T
1154 inline void randomize( T& value,
const A1& a1,
const A2& a2,
const A3& a3,
const A4& a4,
const A5& a5 )
1157 tmp.randomize( value, a1, a2, a3, a4, a5 );