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)7 static inline uint64_t rotl(const uint64_t x, int k)
8 {
9 	return (x << k) | (x >> (64 - k));
10 }
11 
next()12 uint64_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()25 unsigned int RNG::gen()
26 {
27 	return next() & 0x7FFFFFFF;
28 }
29 
operator ()()30 unsigned int RNG::operator()()
31 {
32 	return next()&0xFFFFFFFF;
33 }
34 
between(int lower,int upper)35 int 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)41 bool 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()48 float RNG::uniform01()
49 {
50 	return static_cast<float>(next()&0xFFFFFFFF)/(float)0xFFFFFFFF;
51 }
52 
RNG()53 RNG::RNG()
54 {
55 	s[0] = time(NULL);
56 	s[1] = 614;
57 }
58 
seed(unsigned int sd)59 void RNG::seed(unsigned int sd)
60 {
61 	s[0] = sd;
62 	s[1] = sd;
63 }
64 
65 RNG random_gen;
66