]> git.sesse.net Git - stockfish/blobdiff - src/rkiss.h
Update copyright notes in rkiss.h
[stockfish] / src / rkiss.h
index 924b6c65e7a10d90d6e74156fd4aefd4c4b83f28..5c01a0e56403da996e95a2997080698d2d3d764c 100644 (file)
@@ -21,7 +21,9 @@
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
 
- ** A small "keep it simple and stupid" RNG with some fancy merits:
+ ** George Marsaglia invented the RNG-Kiss-family in the early 90's.
+ ** This is a specific version that Heinz van Saanen derived and
+ ** tested from some public domain code by Bob Jenkins:
  **
  ** Quite platform independent
  ** Passes ALL dieharder tests! Here *nix sys-rand() e.g. fails miserably:-)
@@ -31,9 +33,6 @@
  ** 64 bit seed
  ** Return doubles with a full 53 bit mantissa
  ** Thread safe
- **
- ** (c) Heinz van Saanen
-
 */
 
 #if !defined(RKISS_H_INCLUDED)
@@ -46,24 +45,28 @@ class RKISS {
   // 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 rotate(uint64_t x, uint64_t k) const {
+    return (x << k) | (x >> (64 - k));
+  }
+
+  // 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));
-      s.c = s.d + e;
-      return s.d = e + s.a;
+    const uint64_t
+      e = s.a - rotate(s.b,  7);
+    s.a = s.b ^ rotate(s.c, 13);
+    s.b = s.c + rotate(s.d, 37);
+    s.c = s.d + e;
+    return s.d = e + s.a;
   }
 
   // Init seed and scramble a few rounds
   void raninit() {
 
-      s.a = 0xf1ea5eed;
-      s.b = s.c = s.d = 0xd4e12c77;
-      for (int i = 0; i < 73; i++)
-          rand64();
+    s.a = 0xf1ea5eed;
+    s.b = s.c = s.d = 0xd4e12c77;
+    for (int i = 0; i < 73; i++)
+        rand64();
   }
 
 public: