+++ /dev/null
-/*
- A C-program for MT19937, with initialization improved 2002/1/26.
- Coded by Takuji Nishimura and Makoto Matsumoto.
-
- Before using, initialize the state by using init_genrand(seed)
- or init_by_array(init_key, key_length).
-
- Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. The names of its contributors may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
- Any feedback is very welcome.
- http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
- email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
-*/
-
-#include "mersenne.h"
-
-namespace {
-
- // Period parameters
- const int N = 624;
- const int M = 397;
- const unsigned long MATRIX_A = 0x9908b0dfUL; // Constant vector a
- const unsigned long UPPER_MASK = 0x80000000UL; // Most significant w-r bits
- const unsigned long LOWER_MASK = 0x7fffffffUL; // Least significant r bits
-
- unsigned long mt[N]; // The array for the state vector
- int mti = N + 1; // mti == N+1 means mt[N] is not initialized
-
- // Initializes mt[N] with a seed
- void init_genrand(unsigned long s) {
-
- mt[0]= s & 0xffffffffUL;
- for (mti = 1; mti < N; mti++)
- {
- // See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier.
- // In the previous versions, MSBs of the seed affect
- // only MSBs of the array mt[].
- // 2002/01/09 modified by Makoto Matsumoto
- mt[mti] = 1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti;
- mt[mti] &= 0xffffffffUL; // For > 32 bit machines
- }
- }
-
- // Initialize by an array with array-length
- // init_key is the array for initializing keys
- // key_length is its length
- // slight change for C++, 2004/2/26
- void init_by_array(unsigned long init_key[], int key_length) {
-
- int i = 1;
- int j = 0;
- int k = (N > key_length ? N : key_length);
-
- init_genrand(19650218UL);
-
- for ( ; k; k--)
- {
- mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + init_key[j] + j; // Non linear
- mt[i] &= 0xffffffffUL; // For WORDSIZE > 32 machines
- i++; j++;
- if (i >= N)
- {
- mt[0] = mt[N-1];
- i = 1;
- }
- if (j >= key_length)
- j = 0;
- }
- for (k = N-1; k; k--)
- {
- mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) - i; // Non linear
- mt[i] &= 0xffffffffUL; // For WORDSIZE > 32 machines
- i++;
- if (i >= N)
- {
- mt[0] = mt[N-1];
- i = 1;
- }
- }
- mt[0] = 0x80000000UL; // MSB is 1; assuring non-zero initial array
- }
-
-} // namespace
-
-
-// Generates a random number on [0,0xffffffff]-interval
-uint32_t genrand_int32() {
-
- unsigned long y;
- static unsigned long mag01[2] = {0x0UL, MATRIX_A};
- /* mag01[x] = x * MATRIX_A for x=0,1 */
-
- // Generate N words at one time
- if (mti >= N)
- {
- int kk;
-
- if (mti == N+1) // If init_genrand() has not been called,
- init_genrand(5489UL); // a default initial seed is used.
-
- for (kk = 0; kk < N-M; kk++)
- {
- y = (mt[kk] & UPPER_MASK) | (mt[kk+1] & LOWER_MASK);
- mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
- }
- for ( ; kk < N-1; kk++)
- {
- y = (mt[kk] & UPPER_MASK) | (mt[kk+1] & LOWER_MASK);
- mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
- }
- y = (mt[N-1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
- mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
- mti = 0;
- }
-
- y = mt[mti++];
-
- // Tempering
- y ^= (y >> 11);
- y ^= (y << 7) & 0x9d2c5680UL;
- y ^= (y << 15) & 0xefc60000UL;
- y ^= (y >> 18);
-
- return y;
-}
-
-uint64_t genrand_int64() {
-
- uint64_t x, y;
-
- x = genrand_int32();
- y = genrand_int32();
- return (x << 32) | y;
-}
-
-void init_mersenne() {
-
- unsigned long init[4] = {0x123, 0x234, 0x345, 0x456};
- unsigned long length = 4;
-
- init_by_array(init, length);
-}
+++ /dev/null
-/*
- Stockfish, a UCI chess playing engine derived from Glaurung 2.1
- Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
- Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
-
- Stockfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Stockfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-
-#if !defined(MERSENNE_H_INCLUDED)
-#define MERSENNE_H_INCLUDED
-
-////
-//// Includes
-////
-
-#include "types.h"
-
-
-////
-//// Prototypes
-////
-
-extern uint32_t genrand_int32();
-extern uint64_t genrand_int64();
-extern void init_mersenne();
-
-
-#endif // !defined(MERSENNE_H_INCLUDED)
--- /dev/null
+/** *********************************************************************** **
+ ** A small "keep it simple and stupid" RNG with some fancy merits:
+ **
+ ** Quite platform independent
+ ** Passes ALL dieharder tests! Here *nix sys-rand() e.g. fails miserably:-)
+ ** ~12 times faster than my *nix sys-rand()
+ ** ~4 times faster than SSE2-version of Mersenne twister
+ ** Average cycle length: ~2^126
+ ** 64 bit seed
+ ** Return doubles with a full 53 bit mantissa
+ ** Thread save
+ **
+ ** (c) Heinz van Saanen
+
+ This file is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This file is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ ** *********************************************************************** **/
+
+#ifndef _RKISS_H_
+#define _RKISS_H_
+
+/** Includes **/
+#include <cstdlib> // srand(), rand()
+#include <ctime> // time()
+#include "types.h" // (u)int8_t .. (u)int64_t
+
+
+/** Random class **/
+class RKISS {
+
+private:
+ // Keep variables always together
+ struct S { uint64_t a; uint64_t b; uint64_t c; uint64_t d; } s;
+
+ // 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 ); }
+
+ // (Re)init seed
+ // void init ( uint64_t seed ) { raninit ( seed ); }
+
+ // Return 32 bit unsigned integer in between [0,2^32-1]
+ uint32_t rand32 () { return (uint32_t) rand64 (); }
+
+ // 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;
+ }
+
+ // Return double in between [0,1). Keep full 53 bit mantissa
+ // double frand () { return (int64_t)(rand64()>>11) * (1.0/(67108864.0*134217728.0)); }
+};
+
+// _RKISS_H_
+#endif