X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Frkiss.h;fp=src%2Frkiss.h;h=13f0640765a1ba42f23413ecc65b4cfe3bf22dc8;hp=6e94dc27fa723fc8426216df2fbf0bf3cf2e452c;hb=8fb16df70e032c782b6bf81b211e8dab1724a7dc;hpb=f5e28ef5127ff29310f9c2e8e321eb24214f2439 diff --git a/src/rkiss.h b/src/rkiss.h index 6e94dc27..13f06407 100644 --- a/src/rkiss.h +++ b/src/rkiss.h @@ -27,51 +27,56 @@ ** *********************************************************************** **/ -#ifndef _RKISS_H_ -#define _RKISS_H_ +#if !defined(RKISS_H_INCLUDED) +#define RKISS_H_INCLUDED -/** Includes **/ -#include // srand(), rand() -#include // time() -#include "types.h" // (u)int8_t .. (u)int64_t +//// +//// Includes +//// -/** Random class **/ -class RKISS { +#include +#include -private: - // Keep variables always together - struct S { uint64_t a; uint64_t b; uint64_t c; uint64_t d; } s; +#include "types.h" - // Init seed and scramble a few rounds - void raninit ( uint64_t seed ) { - s.a = 0xf1ea5eed; s.b = s.c = s.d = seed; - for ( uint64_t i=0; i<8; i++ ) rand64(); - } -public: - // Instance seed random or implicite - RKISS() { ::srand ( (uint32_t)time(NULL) ); raninit ( (uint64_t)::rand() ); } - // RKISS( uint64_t s ) { raninit ( s ); } +//// +//// Types +//// - // (Re)init seed - // void init ( uint64_t seed ) { raninit ( seed ); } +class RKISS { - // Return 32 bit unsigned integer in between [0,2^32-1] - uint32_t rand32 () { return (uint32_t) rand64 (); } + // Keep variables always together + struct S { uint64_t a, b, c, d; } s; // Return 64 bit unsigned integer in between [0,2^64-1] - uint64_t rand64 () { - const uint64_t e = s.a - ((s.b<<7) | (s.b>>57)); - s.a = s.b ^ ((s.c<<13) | (s.c>>51)); - s.b = s.c + ((s.d<<37) | (s.d>>27)); + uint64_t rand64() { + + const uint64_t + e = s.a - ((s.b << 7) | (s.b >> 57)); + s.a = s.b ^ ((s.c << 13) | (s.c >> 51)); + s.b = s.c + ((s.d << 37) | (s.d >> 27)); s.c = s.d + e; return s.d = e + s.a; } - // Return double in between [0,1). Keep full 53 bit mantissa - // double frand () { return (int64_t)(rand64()>>11) * (1.0/(67108864.0*134217728.0)); } + // Init seed and scramble a few rounds + void raninit(uint64_t seed) { + + s.a = 0xf1ea5eed; + s.b = s.c = s.d = seed; + for (uint64_t i = 0; i < 8; i++) + rand64(); + } + +public: + // Instance seed random or implicite + RKISS() { ::srand(uint32_t(time(NULL))); raninit(uint64_t(::rand())); } + + // Return random number of type T (must be castable from uint64_t) + template + T rand() { return T(rand64()); } }; -// _RKISS_H_ -#endif +#endif // !defined(RKISS_H_INCLUDED)