#ifndef J_RANDOM_H #define J_RANDOM_H struct Random { unsigned long long seed; Random() : seed(0x0000A6B5C4D3E2F1LL) {} Random(long long seed) { setSeed(seed); } void setSeed(long long newSeed) { seed = newSeed ^ 0x00000005DEECE66DLL; } int next(int bits) { seed *= 0x00000005DEECE66DLL; seed += 0x000000000000000BLL; seed &= 0x0000FFFFFFFFFFFFLL; return (int) (seed >> (48 - bits)); } int nextInt() { return next(32); } int nextInt(int n) { if ((n & -n) == n) // if n only has 1 bit set (n is a power of 2) { long long x = next(31); x *= n; return (int)(x >> 31); } int bits, val; do { bits = next(31); val = bits % n; } while (bits - val + (n-1) < 0); return val; } long long nextLong() { long long x = next(32); x <<= 32; return x + next(32); } double nextDouble() { long long x = next(26); x <<= 27; x += next(27); return x / 9007199254740992.0; } bool nextBoolean() { return next(1) != 0; } }; #endif