stellarUCI Chess engine written in C++20 |
git clone git://git.dimitrijedobrota.com/stellar.git |
Log | Files | Refs | README | LICENSE | |
random.hpp (905B)
1 #ifndef STELLAR_RANDOM_H 2 #define STELLAR_RANDOM_H 3 4 #include "utils.hpp" 5 6 class Random { 7 public: 8 constexpr Random(void) = default; 9 constexpr Random(U64 seed) : state(seed) {} 10 11 constexpr U64 operator()(void) { return get_U64(); } 12 13 constexpr void reset(void) { state = seed; } 14 15 constexpr U32 get_U32(void) { 16 U32 number = state; 17 18 number ^= number << 13; 19 number ^= number >> 17; 20 number ^= number << 5; 21 22 return state = number; 23 } 24 25 constexpr U64 get_U64(void) { 26 U64 n1, n2, n3, n4; 27 28 n1 = (U64)(get_U32()) & C64(0xFFFF); 29 n2 = (U64)(get_U32()) & C64(0xFFFF); 30 n3 = (U64)(get_U32()) & C64(0xFFFF); 31 n4 = (U64)(get_U32()) & C64(0xFFFF); 32 33 return n1 | (n2 << 16) | (n3 << 32) | (n4 << 48); 34 } 35 36 private: 37 static inline constexpr const U32 seed = C32(1804289383); 38 U32 state = seed; 39 }; 40 41 #endif