Guest User

Untitled

a guest
Oct 15th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.69 KB | None | 0 0
  1. //
  2. // Random.hpp
  3. //
  4. // Requires Basic_Types.hpp
  5.  
  6. #ifndef __TOOLS_RANDOM__
  7. #define __TOOLS_RANDOM__
  8.  
  9. #include <climits>
  10. #include <time.h>
  11. #include <boost/random.hpp>
  12.  
  13. #include "Basic_Types.hpp"
  14.  
  15. namespace Random
  16. {
  17. // ============================================================================ Random
  18. // Random
  19. // ----------------------------------------------------------------------------
  20. class Generator
  21. {
  22. private:
  23. // -------------------------------------------------------------------- Private Typedefs
  24. typedef boost::mt19937 RNG_t;
  25.  
  26. // -------------------------------------------------------------------- Generators
  27. RNG_t rng;
  28.  
  29. boost::uniform_int < uint8_t > rnd_bits_dist_u8;
  30. boost::uniform_int < uint16_t > rnd_bits_dist_u16;
  31. boost::uniform_int < uint32_t > rnd_bits_dist_u32;
  32. boost::uniform_int < uint64_t > rnd_bits_dist_u64;
  33. boost::uniform_real< float > rnd_float_dist_01;
  34. boost::uniform_real< double > rnd_double_dist_01;
  35.  
  36. boost::variate_generator<RNG_t &, boost::uniform_int < uint8_t > > rnd_bits_u8;
  37. boost::variate_generator<RNG_t &, boost::uniform_int < uint16_t > > rnd_bits_u16;
  38. boost::variate_generator<RNG_t &, boost::uniform_int < uint32_t > > rnd_bits_u32;
  39. boost::variate_generator<RNG_t &, boost::uniform_int < uint64_t > > rnd_bits_u64;
  40. boost::variate_generator<RNG_t &, boost::uniform_real< float > > rnd_float_01;
  41. boost::variate_generator<RNG_t &, boost::uniform_real< double > > rnd_double_01;
  42.  
  43. public:
  44. // ==================================================================== Construct / Destruct
  45. // Construct / Destruct
  46. // -------------------------------------------------------------------- Constructor()
  47. Generator()
  48.  
  49. : rng ( static_cast<unsigned>(time(NULL)) ),
  50. rnd_bits_dist_u8 ( 0, UINT8_MAX ),
  51. rnd_bits_dist_u16 ( 0, UINT16_MAX ),
  52. rnd_bits_dist_u32 ( 0, UINT32_MAX ),
  53. rnd_bits_dist_u64 ( 0, UINT64_MAX ),
  54. rnd_float_dist_01 (),
  55. rnd_double_dist_01(),
  56. rnd_bits_u8 ( rng, rnd_bits_dist_u8 ),
  57. rnd_bits_u16 ( rng, rnd_bits_dist_u16 ),
  58. rnd_bits_u32 ( rng, rnd_bits_dist_u32 ),
  59. rnd_bits_u64 ( rng, rnd_bits_dist_u64 ),
  60. rnd_float_01 ( rng, rnd_float_dist_01 ),
  61. rnd_double_01 ( rng, rnd_double_dist_01 ) {}
  62.  
  63. // -------------------------------------------------------------------- Constructor( seed )
  64. Generator( unsigned seed )
  65.  
  66. : rng ( seed ),
  67. rnd_bits_dist_u8 ( 0, UINT8_MAX ),
  68. rnd_bits_dist_u16 ( 0, UINT16_MAX ),
  69. rnd_bits_dist_u32 ( 0, UINT32_MAX ),
  70. rnd_bits_dist_u64 ( 0, UINT64_MAX ),
  71. rnd_float_dist_01 (),
  72. rnd_double_dist_01(),
  73. rnd_bits_u8 ( rng, rnd_bits_dist_u8 ),
  74. rnd_bits_u16 ( rng, rnd_bits_dist_u16 ),
  75. rnd_bits_u32 ( rng, rnd_bits_dist_u32 ),
  76. rnd_bits_u64 ( rng, rnd_bits_dist_u64 ),
  77. rnd_float_01 ( rng, rnd_float_dist_01 ),
  78. rnd_double_01 ( rng, rnd_double_dist_01 ) {}
  79.  
  80.  
  81. // ==================================================================== Public API
  82. // Public API
  83. // -------------------------------------------------------------------- Re-seed()
  84. void Reseed( unsigned seed ) { rng.seed( seed ); }
  85.  
  86. // -------------------------------------------------------------------- Random( 0 <-> 1 )
  87. inline float Float_01 () { return rnd_float_01 (); }
  88. inline double Double_01() { return rnd_double_01(); }
  89.  
  90.  
  91. // -------------------------------------------------------------------- Random Bits
  92. inline uint8_t Bits_8 () { return rnd_bits_u8 (); }
  93. inline uint16_t Bits_16 () { return rnd_bits_u16(); }
  94. inline uint32_t Bits_32 () { return rnd_bits_u32(); }
  95. inline uint64_t Bits_64 () { return rnd_bits_u64(); }
  96.  
  97.  
  98. // -------------------------------------------------------------------- Random Integers [low, high]
  99. inline uint8_t Unsigned_8 ( uint8_t low, uint8_t high ) { return uint8_t (Bits_8 () % (high - low + 1)) + low; }
  100. inline uint16_t Unsigned_16 ( uint16_t low, uint16_t high ) { return uint16_t (Bits_16() % (high - low + 1)) + low; }
  101. inline uint32_t Unsigned_32 ( uint32_t low, uint32_t high ) { return uint32_t (Bits_32() % (high - low + 1)) + low; }
  102. inline uint64_t Unsigned_64 ( uint64_t low, uint64_t high ) { return uint64_t (Bits_64() % (high - low + 1)) + low; }
  103.  
  104. inline int8_t Int_8 ( int8_t low, int8_t high ) { return int8_t (Bits_8 () % (high - low + 1)) + low; }
  105. inline int16_t Int_16 ( int16_t low, int16_t high ) { return int16_t (Bits_16() % (high - low + 1)) + low; }
  106. inline int32_t Int_32 ( int32_t low, int32_t high ) { return int32_t (Bits_32() % (high - low + 1)) + low; }
  107. inline int64_t Int_64 ( int64_t low, int64_t high ) { return int64_t (Bits_64() % (high - low + 1)) + low; }
  108.  
  109.  
  110. // -------------------------------------------------------------------- Random Integers std::pair( [low, high] )
  111. inline uint8_t Unsigned_8 ( const Uint8_Pair range ) { return Unsigned_8 ( range.first, range.second ); }
  112. inline uint16_t Unsigned_16 ( const Uint16_Pair range ) { return Unsigned_16 ( range.first, range.second ); }
  113. inline uint32_t Unsigned_32 ( const Uint32_Pair range ) { return Unsigned_32 ( range.first, range.second ); }
  114. inline uint64_t Unsigned_64 ( const Uint64_Pair range ) { return Unsigned_64 ( range.first, range.second ); }
  115.  
  116. inline int8_t Int_8 ( const Int8_Pair range ) { return Int_8 ( range.first, range.second ); }
  117. inline int16_t Int_16 ( const Int16_Pair range ) { return Int_16 ( range.first, range.second ); }
  118. inline int32_t Int_32 ( const Int32_Pair range ) { return Int_32 ( range.first, range.second ); }
  119. inline int64_t Int_64 ( const Int64_Pair range ) { return Int_64 ( range.first, range.second ); }
  120.  
  121.  
  122. // -------------------------------------------------------------------- Random Integers [low, high] via floating-point
  123. inline uint8_t Number_u8 ( uint8_t low, uint8_t high ) { return uint8_t (rnd_float_01 () * float(high - low + 1)) + low; }
  124. inline uint16_t Number_u16 ( uint16_t low, uint16_t high ) { return uint16_t (rnd_float_01 () * float(high - low + 1)) + low; }
  125. inline uint32_t Number_u32 ( uint32_t low, uint32_t high ) { return uint32_t (rnd_float_01 () * float(high - low + 1)) + low; }
  126. inline uint64_t Number_u64 ( uint64_t low, uint64_t high ) { return uint64_t (rnd_float_01 () * float(high - low + 1)) + low; }
  127.  
  128. inline int8_t Number_i8 ( int8_t low, int8_t high ) { return int8_t (rnd_float_01 () * float(high - low + 1)) + low; }
  129. inline int16_t Number_i16 ( int16_t low, int16_t high ) { return int16_t (rnd_float_01 () * float(high - low + 1)) + low; }
  130. inline int32_t Number_i32 ( int32_t low, int32_t high ) { return int32_t (rnd_float_01 () * float(high - low + 1)) + low; }
  131. inline int64_t Number_i64 ( int64_t low, int64_t high ) { return int64_t (rnd_float_01 () * float(high - low + 1)) + low; }
  132.  
  133.  
  134. // -------------------------------------------------------------------- Random Integers std::pair( [low, high] ) via floating-point
  135. inline uint8_t Number_u8 ( const Uint8_Pair range ) { return Number_u8 ( range.first, range.second ); }
  136. inline uint16_t Number_u16 ( const Uint16_Pair range ) { return Number_u16 ( range.first, range.second ); }
  137. inline uint32_t Number_u32 ( const Uint32_Pair range ) { return Number_u32 ( range.first, range.second ); }
  138. inline uint64_t Number_u64 ( const Uint64_Pair range ) { return Number_u64 ( range.first, range.second ); }
  139.  
  140. inline int8_t Number_i8 ( const Int8_Pair range ) { return Number_i8 ( range.first, range.second ); }
  141. inline int16_t Number_i16 ( const Int16_Pair range ) { return Number_i16 ( range.first, range.second ); }
  142. inline int32_t Number_i32 ( const Int32_Pair range ) { return Number_i32 ( range.first, range.second ); }
  143. inline int64_t Number_i64 ( const Int64_Pair range ) { return Number_i64 ( range.first, range.second ); }
  144.  
  145.  
  146. // -------------------------------------------------------------------- Random Floating Point [low, high)
  147. inline float Float ( float low, float high ) { return (rnd_float_01 () * (high - low)) + low; }
  148. inline double Double ( double low, double high ) { return (rnd_double_01() * (high - low)) + low; }
  149.  
  150.  
  151. // -------------------------------------------------------------------- Random Floating Point std::pair( [low, high) )
  152. inline float Float ( const Float_Pair range ) { return Float ( range.first, range.second ); }
  153. inline double Double( const Double_Pair range ) { return Double( range.first, range.second ); }
  154.  
  155.  
  156. // -------------------------------------------------------------------- Random< templated/overloaded > [low, high]
  157. inline uint8_t Number( const uint8_t low, const uint8_t high ) { return Unsigned_8 ( low, high ); }
  158. inline uint16_t Number( const uint16_t low, const uint16_t high ) { return Unsigned_16( low, high ); }
  159. inline uint32_t Number( const uint32_t low, const uint32_t high ) { return Unsigned_32( low, high ); }
  160. inline uint64_t Number( const uint64_t low, const uint64_t high ) { return Unsigned_64( low, high ); }
  161.  
  162. inline int8_t Number( const int8_t low, const int8_t high ) { return Int_8 ( low, high ); }
  163. inline int16_t Number( const int16_t low, const int16_t high ) { return Int_16 ( low, high ); }
  164. inline int32_t Number( const int32_t low, const int32_t high ) { return Int_32 ( low, high ); }
  165. inline int64_t Number( const int64_t low, const int64_t high ) { return Int_64 ( low, high ); }
  166.  
  167. inline float Number( const float low, const float high ) { return Float ( low, high ); }
  168. 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; }
  169.  
  170.  
  171. // -------------------------------------------------------------------- Random< templated/overloaded > std::pair( [low, high] )
  172. inline uint8_t Number ( const Uint8_Pair range ) { return Unsigned_8 ( range ); }
  173. inline uint16_t Number ( const Uint16_Pair range ) { return Unsigned_16( range ); }
  174. inline uint32_t Number ( const Uint32_Pair range ) { return Unsigned_32( range ); }
  175. inline uint64_t Number ( const Uint64_Pair range ) { return Unsigned_64( range ); }
  176.  
  177. inline int8_t Number ( const Int8_Pair range ) { return Int_8 ( range ); }
  178. inline int16_t Number ( const Int16_Pair range ) { return Int_16 ( range ); }
  179. inline int32_t Number ( const Int32_Pair range ) { return Int_32 ( range ); }
  180. inline int64_t Number ( const Int64_Pair range ) { return Int_64 ( range ); }
  181.  
  182. inline float Number( std::pair< float, float > range ) { return Float ( range ); }
  183. 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; }
  184.  
  185.  
  186. // -------------------------------------------------------------------- Chance( percent / 100 )
  187. inline bool Chance( float probability ) { return Float_01() < probability; }
  188. };
  189. }
  190.  
  191. #endif
Add Comment
Please, Sign In to add comment