Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Random.hpp
- //
- // Requires Basic_Types.hpp
- #ifndef __TOOLS_RANDOM__
- #define __TOOLS_RANDOM__
- #include <climits>
- #include <time.h>
- #include <boost/random.hpp>
- #include "Basic_Types.hpp"
- namespace Random
- {
- // ============================================================================ Random
- // Random
- // ----------------------------------------------------------------------------
- class Generator
- {
- private:
- // -------------------------------------------------------------------- Private Typedefs
- typedef boost::mt19937 RNG_t;
- // -------------------------------------------------------------------- Generators
- RNG_t rng;
- boost::uniform_int < uint8_t > rnd_bits_dist_u8;
- boost::uniform_int < uint16_t > rnd_bits_dist_u16;
- boost::uniform_int < uint32_t > rnd_bits_dist_u32;
- boost::uniform_int < uint64_t > rnd_bits_dist_u64;
- boost::uniform_real< float > rnd_float_dist_01;
- boost::uniform_real< double > rnd_double_dist_01;
- boost::variate_generator<RNG_t &, boost::uniform_int < uint8_t > > rnd_bits_u8;
- boost::variate_generator<RNG_t &, boost::uniform_int < uint16_t > > rnd_bits_u16;
- boost::variate_generator<RNG_t &, boost::uniform_int < uint32_t > > rnd_bits_u32;
- boost::variate_generator<RNG_t &, boost::uniform_int < uint64_t > > rnd_bits_u64;
- boost::variate_generator<RNG_t &, boost::uniform_real< float > > rnd_float_01;
- boost::variate_generator<RNG_t &, boost::uniform_real< double > > rnd_double_01;
- public:
- // ==================================================================== Construct / Destruct
- // Construct / Destruct
- // -------------------------------------------------------------------- Constructor()
- Generator()
- : rng ( static_cast<unsigned>(time(NULL)) ),
- rnd_bits_dist_u8 ( 0, UINT8_MAX ),
- rnd_bits_dist_u16 ( 0, UINT16_MAX ),
- rnd_bits_dist_u32 ( 0, UINT32_MAX ),
- rnd_bits_dist_u64 ( 0, UINT64_MAX ),
- rnd_float_dist_01 (),
- rnd_double_dist_01(),
- rnd_bits_u8 ( rng, rnd_bits_dist_u8 ),
- rnd_bits_u16 ( rng, rnd_bits_dist_u16 ),
- rnd_bits_u32 ( rng, rnd_bits_dist_u32 ),
- rnd_bits_u64 ( rng, rnd_bits_dist_u64 ),
- rnd_float_01 ( rng, rnd_float_dist_01 ),
- rnd_double_01 ( rng, rnd_double_dist_01 ) {}
- // -------------------------------------------------------------------- Constructor( seed )
- Generator( unsigned seed )
- : rng ( seed ),
- rnd_bits_dist_u8 ( 0, UINT8_MAX ),
- rnd_bits_dist_u16 ( 0, UINT16_MAX ),
- rnd_bits_dist_u32 ( 0, UINT32_MAX ),
- rnd_bits_dist_u64 ( 0, UINT64_MAX ),
- rnd_float_dist_01 (),
- rnd_double_dist_01(),
- rnd_bits_u8 ( rng, rnd_bits_dist_u8 ),
- rnd_bits_u16 ( rng, rnd_bits_dist_u16 ),
- rnd_bits_u32 ( rng, rnd_bits_dist_u32 ),
- rnd_bits_u64 ( rng, rnd_bits_dist_u64 ),
- rnd_float_01 ( rng, rnd_float_dist_01 ),
- rnd_double_01 ( rng, rnd_double_dist_01 ) {}
- // ==================================================================== Public API
- // Public API
- // -------------------------------------------------------------------- Re-seed()
- void Reseed( unsigned seed ) { rng.seed( seed ); }
- // -------------------------------------------------------------------- Random( 0 <-> 1 )
- inline float Float_01 () { return rnd_float_01 (); }
- inline double Double_01() { return rnd_double_01(); }
- // -------------------------------------------------------------------- Random Bits
- inline uint8_t Bits_8 () { return rnd_bits_u8 (); }
- inline uint16_t Bits_16 () { return rnd_bits_u16(); }
- inline uint32_t Bits_32 () { return rnd_bits_u32(); }
- inline uint64_t Bits_64 () { return rnd_bits_u64(); }
- // -------------------------------------------------------------------- Random Integers [low, high]
- inline uint8_t Unsigned_8 ( uint8_t low, uint8_t high ) { return uint8_t (Bits_8 () % (high - low + 1)) + low; }
- inline uint16_t Unsigned_16 ( uint16_t low, uint16_t high ) { return uint16_t (Bits_16() % (high - low + 1)) + low; }
- inline uint32_t Unsigned_32 ( uint32_t low, uint32_t high ) { return uint32_t (Bits_32() % (high - low + 1)) + low; }
- inline uint64_t Unsigned_64 ( uint64_t low, uint64_t high ) { return uint64_t (Bits_64() % (high - low + 1)) + low; }
- inline int8_t Int_8 ( int8_t low, int8_t high ) { return int8_t (Bits_8 () % (high - low + 1)) + low; }
- inline int16_t Int_16 ( int16_t low, int16_t high ) { return int16_t (Bits_16() % (high - low + 1)) + low; }
- inline int32_t Int_32 ( int32_t low, int32_t high ) { return int32_t (Bits_32() % (high - low + 1)) + low; }
- inline int64_t Int_64 ( int64_t low, int64_t high ) { return int64_t (Bits_64() % (high - low + 1)) + low; }
- // -------------------------------------------------------------------- Random Integers std::pair( [low, high] )
- inline uint8_t Unsigned_8 ( const Uint8_Pair range ) { return Unsigned_8 ( range.first, range.second ); }
- inline uint16_t Unsigned_16 ( const Uint16_Pair range ) { return Unsigned_16 ( range.first, range.second ); }
- inline uint32_t Unsigned_32 ( const Uint32_Pair range ) { return Unsigned_32 ( range.first, range.second ); }
- inline uint64_t Unsigned_64 ( const Uint64_Pair range ) { return Unsigned_64 ( range.first, range.second ); }
- inline int8_t Int_8 ( const Int8_Pair range ) { return Int_8 ( range.first, range.second ); }
- inline int16_t Int_16 ( const Int16_Pair range ) { return Int_16 ( range.first, range.second ); }
- inline int32_t Int_32 ( const Int32_Pair range ) { return Int_32 ( range.first, range.second ); }
- inline int64_t Int_64 ( const Int64_Pair range ) { return Int_64 ( range.first, range.second ); }
- // -------------------------------------------------------------------- Random Integers [low, high] via floating-point
- inline uint8_t Number_u8 ( uint8_t low, uint8_t high ) { return uint8_t (rnd_float_01 () * float(high - low + 1)) + low; }
- inline uint16_t Number_u16 ( uint16_t low, uint16_t high ) { return uint16_t (rnd_float_01 () * float(high - low + 1)) + low; }
- inline uint32_t Number_u32 ( uint32_t low, uint32_t high ) { return uint32_t (rnd_float_01 () * float(high - low + 1)) + low; }
- inline uint64_t Number_u64 ( uint64_t low, uint64_t high ) { return uint64_t (rnd_float_01 () * float(high - low + 1)) + low; }
- inline int8_t Number_i8 ( int8_t low, int8_t high ) { return int8_t (rnd_float_01 () * float(high - low + 1)) + low; }
- inline int16_t Number_i16 ( int16_t low, int16_t high ) { return int16_t (rnd_float_01 () * float(high - low + 1)) + low; }
- inline int32_t Number_i32 ( int32_t low, int32_t high ) { return int32_t (rnd_float_01 () * float(high - low + 1)) + low; }
- inline int64_t Number_i64 ( int64_t low, int64_t high ) { return int64_t (rnd_float_01 () * float(high - low + 1)) + low; }
- // -------------------------------------------------------------------- Random Integers std::pair( [low, high] ) via floating-point
- inline uint8_t Number_u8 ( const Uint8_Pair range ) { return Number_u8 ( range.first, range.second ); }
- inline uint16_t Number_u16 ( const Uint16_Pair range ) { return Number_u16 ( range.first, range.second ); }
- inline uint32_t Number_u32 ( const Uint32_Pair range ) { return Number_u32 ( range.first, range.second ); }
- inline uint64_t Number_u64 ( const Uint64_Pair range ) { return Number_u64 ( range.first, range.second ); }
- inline int8_t Number_i8 ( const Int8_Pair range ) { return Number_i8 ( range.first, range.second ); }
- inline int16_t Number_i16 ( const Int16_Pair range ) { return Number_i16 ( range.first, range.second ); }
- inline int32_t Number_i32 ( const Int32_Pair range ) { return Number_i32 ( range.first, range.second ); }
- inline int64_t Number_i64 ( const Int64_Pair range ) { return Number_i64 ( range.first, range.second ); }
- // -------------------------------------------------------------------- Random Floating Point [low, high)
- inline float Float ( float low, float high ) { return (rnd_float_01 () * (high - low)) + low; }
- inline double Double ( double low, double high ) { return (rnd_double_01() * (high - low)) + low; }
- // -------------------------------------------------------------------- Random Floating Point std::pair( [low, high) )
- inline float Float ( const Float_Pair range ) { return Float ( range.first, range.second ); }
- inline double Double( const Double_Pair range ) { return Double( range.first, range.second ); }
- // -------------------------------------------------------------------- Random< templated/overloaded > [low, high]
- inline uint8_t Number( const uint8_t low, const uint8_t high ) { return Unsigned_8 ( low, high ); }
- inline uint16_t Number( const uint16_t low, const uint16_t high ) { return Unsigned_16( low, high ); }
- inline uint32_t Number( const uint32_t low, const uint32_t high ) { return Unsigned_32( low, high ); }
- inline uint64_t Number( const uint64_t low, const uint64_t high ) { return Unsigned_64( low, high ); }
- inline int8_t Number( const int8_t low, const int8_t high ) { return Int_8 ( low, high ); }
- inline int16_t Number( const int16_t low, const int16_t high ) { return Int_16 ( low, high ); }
- inline int32_t Number( const int32_t low, const int32_t high ) { return Int_32 ( low, high ); }
- inline int64_t Number( const int64_t low, const int64_t high ) { return Int_64 ( low, high ); }
- inline float Number( const float low, const float high ) { return Float ( low, high ); }
- template < typename value_t > inline value_t Number( const value_t low, const value_t high ) { return static_cast< value_t >(rnd_double_01() * double(high - low)) + low; }
- // -------------------------------------------------------------------- Random< templated/overloaded > std::pair( [low, high] )
- inline uint8_t Number ( const Uint8_Pair range ) { return Unsigned_8 ( range ); }
- inline uint16_t Number ( const Uint16_Pair range ) { return Unsigned_16( range ); }
- inline uint32_t Number ( const Uint32_Pair range ) { return Unsigned_32( range ); }
- inline uint64_t Number ( const Uint64_Pair range ) { return Unsigned_64( range ); }
- inline int8_t Number ( const Int8_Pair range ) { return Int_8 ( range ); }
- inline int16_t Number ( const Int16_Pair range ) { return Int_16 ( range ); }
- inline int32_t Number ( const Int32_Pair range ) { return Int_32 ( range ); }
- inline int64_t Number ( const Int64_Pair range ) { return Int_64 ( range ); }
- inline float Number( std::pair< float, float > range ) { return Float ( range ); }
- template < typename value_t > inline value_t Number( std::pair< value_t, value_t > range ) { return value_t (rnd_double_01() * double(range.second - range.first)) + range.first; }
- // -------------------------------------------------------------------- Chance( percent / 100 )
- inline bool Chance( float probability ) { return Float_01() < probability; }
- };
- }
- #endif
Add Comment
Please, Sign In to add comment