stellar

UCI Chess engine written in C++20
git clone git://git.dimitrijedobrota.com/stellar.git
Log | Files | Refs | README | LICENSE

random.hpp (905B)


0 #ifndef STELLAR_RANDOM_H
1 #define STELLAR_RANDOM_H
3 #include "utils.hpp"
5 class Random {
6 public:
7 constexpr Random(void) = default;
8 constexpr Random(U64 seed) : state(seed) {}
10 constexpr U64 operator()(void) { return get_U64(); }
12 constexpr void reset(void) { state = seed; }
14 constexpr U32 get_U32(void) {
15 U32 number = state;
17 number ^= number << 13;
18 number ^= number >> 17;
19 number ^= number << 5;
21 return state = number;
22 }
24 constexpr U64 get_U64(void) {
25 U64 n1, n2, n3, n4;
27 n1 = (U64)(get_U32()) & C64(0xFFFF);
28 n2 = (U64)(get_U32()) & C64(0xFFFF);
29 n3 = (U64)(get_U32()) & C64(0xFFFF);
30 n4 = (U64)(get_U32()) & C64(0xFFFF);
32 return n1 | (n2 << 16) | (n3 << 32) | (n4 << 48);
33 }
35 private:
36 static inline constexpr const U32 seed = C32(1804289383);
37 U32 state = seed;
38 };
40 #endif