Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | None | 0 0
  1. // Pseudo Random Number Generator : generate repeatable sequence of values that
  2. //   appear random by scrambling the bits of a 32-bit integer value.
  3. //
  4. // Interface :
  5. //   PRNG(s) - set starting seed
  6. //   seed(s) - reset seed
  7. //   prng() - generate random value in range [0,UINT_MAX]
  8. //   prng(u) - generate random value in range [0,u]
  9. //   prng(l,u) - generate random value in range [l,u]
  10. //
  11. // Examples : generate random number between 5-21
  12. //   prng() % 17 + 5    values 0-16 + 5 = 5-21
  13. //   prng( 16 ) + 5
  14. //   prng( 5, 21 )
  15.  
  16. #ifndef __PRNG_H__
  17. #define __PRNG_H__
  18.  
  19. #include <stdint.h>                 // uint32_t
  20. #include <cassert>                  // assert
  21.  
  22. class PRNG {
  23.     uint32_t  seed_;    // same results on 32/64-bit architectures
  24.   public:
  25.     PRNG( uint32_t  s = 362436069 ) {
  26.     seed_ = s;                  // set seed
  27.     assert( ("invalid seed", seed_ > 0) );
  28.     }
  29.     void seed( uint32_t  s ) {              // reset seed
  30.     seed_ = s;                  // set seed
  31.     assert( ("invalid seed", seed_ > 0) );
  32.     }
  33.     uint32_t operator()() {             // [0,UINT_MAX]
  34.     seed_ = 36969 * (seed_ & 65535) + (seed_>> 16); // scramble bits
  35.     return seed_;
  36.     }
  37.     uint32_t operator()( uint32_t  u ) {        // [0,u]
  38.     return operator()() % (u + 1);
  39.     }
  40.     uint32_t operator()( uint32_t l, uint32_t u ) { // [l,u]
  41.     assert( ("invalid random range", l < u) );
  42.     return operator()( u - l ) + l;
  43.     }
  44. };
  45.  
  46. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement