1 #include "tpt-rand.h" 2 #include <cstdlib> 3 #include <ctime> 4 5 /* xoroshiro128+ by David Blackman and Sebastiano Vigna */ 6 rotl(const uint64_t x,int k)7static inline uint64_t rotl(const uint64_t x, int k) 8 { 9 return (x << k) | (x >> (64 - k)); 10 } 11 next()12uint64_t RNG::next() 13 { 14 const uint64_t s0 = s[0]; 15 uint64_t s1 = s[1]; 16 const uint64_t result = s0 + s1; 17 18 s1 ^= s0; 19 s[0] = rotl(s0, 55) ^ s1 ^ (s1 << 14); // a, b 20 s[1] = rotl(s1, 36); // c 21 22 return result; 23 } 24 gen()25unsigned int RNG::gen() 26 { 27 return next() & 0x7FFFFFFF; 28 } 29 operator ()()30unsigned int RNG::operator()() 31 { 32 return next()&0xFFFFFFFF; 33 } 34 between(int lower,int upper)35int RNG::between(int lower, int upper) 36 { 37 unsigned int r = next(); 38 return static_cast<int>(r % (upper - lower + 1)) + lower; 39 } 40 chance(int nominator,unsigned int denominator)41bool RNG::chance(int nominator, unsigned int denominator) 42 { 43 if (nominator < 0) 44 return false; 45 return next() % denominator < static_cast<unsigned int>(nominator); 46 } 47 uniform01()48float RNG::uniform01() 49 { 50 return static_cast<float>(next()&0xFFFFFFFF)/(float)0xFFFFFFFF; 51 } 52 RNG()53RNG::RNG() 54 { 55 s[0] = time(NULL); 56 s[1] = 614; 57 } 58 seed(unsigned int sd)59void RNG::seed(unsigned int sd) 60 { 61 s[0] = sd; 62 s[1] = sd; 63 } 64 65 RNG random_gen; 66