2 Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3 Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4 Copyright (C) 2008-2013 Marco Costalba, Joona Kiiski, Tord Romstad
6 Stockfish is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 Stockfish is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 This file is based on original code by Heinz van Saanen and is
20 available under the GNU General Public License as published by
21 the Free Software Foundation, either version 3 of the License, or
22 (at your option) any later version.
25 #ifndef RKISS_H_INCLUDED
26 #define RKISS_H_INCLUDED
30 /// RKISS is our pseudo random number generator (PRNG) used to compute hash keys.
31 /// George Marsaglia invented the RNG-Kiss-family in the early 90's. This is a
32 /// specific version that Heinz van Saanen derived from some public domain code
33 /// by Bob Jenkins. Following the feature list, as tested by Heinz.
35 /// - Quite platform independent
36 /// - Passes ALL dieharder tests! Here *nix sys-rand() e.g. fails miserably:-)
37 /// - ~12 times faster than my *nix sys-rand()
38 /// - ~4 times faster than SSE2-version of Mersenne twister
39 /// - Average cycle length: ~2^126
41 /// - Return doubles with a full 53 bit mantissa
46 struct S { uint64_t a, b, c, d; } s; // Keep variables always together
48 uint64_t rotate(uint64_t x, uint64_t k) const {
49 return (x << k) | (x >> (64 - k));
55 e = s.a - rotate(s.b, 7);
56 s.a = s.b ^ rotate(s.c, 13);
57 s.b = s.c + rotate(s.d, 37);
63 RKISS(int seed = 73) {
66 s.b = s.c = s.d = 0xd4e12c77;
67 for (int i = 0; i < seed; i++) // Scramble a few rounds
71 template<typename T> T rand() { return T(rand64()); }
74 #endif // #ifndef RKISS_H_INCLUDED