@Override public int nextInt() { return next(32); }
@Override public void nextDoubles(double[] d) { int n = d.length; for (int i = 0; i < n; i++) { d[i] = nextDouble(); } }
@Override public int next(int numbits) { if (bitState) { bits64 = nextLong(); bitState = false; return (int) (bits64 >>> (64 - numbits)); } else { bitState = true; return ((int) bits64) >>> (32 - numbits); } }
@Nonnull public static PRNG createPRNG(@Nonnull PRNGType type) { final PRNG rng; switch (type) { case java: rng = new JavaRandom(); break; case secure: rng = new JavaRandom(new SecureRandom()); break; case smile: rng = new SmileRandom(); break; case smileMT: rng = new SmileRandom(new smile.math.random.MersenneTwister()); break; case smileMT64: rng = new SmileRandom(new smile.math.random.MersenneTwister64()); break; case commonsMath3MT: rng = new CommonsMathRandom(new org.apache.commons.math3.random.MersenneTwister()); break; default: throw new IllegalStateException("Unexpected type: " + type); } return rng; }
/** * Constructor. * @param seed */ public MersenneTwister64(long seed) { setSeed(seed); }
@Nonnull public static PRNG createPRNG(@Nonnull PRNGType type, long seed) { final PRNG rng; switch (type) { case java: rng = new JavaRandom(seed); break; case secure: rng = new JavaRandom(new SecureRandom(Primitives.toBytes(seed))); break; case smile: rng = new SmileRandom(seed); break; case smileMT: rng = new SmileRandom( new smile.math.random.MersenneTwister(Primitives.hashCode(seed))); break; case smileMT64: rng = new SmileRandom(new smile.math.random.MersenneTwister64(seed)); break; case commonsMath3MT: rng = new CommonsMathRandom( new org.apache.commons.math3.random.MersenneTwister(seed)); break; default: throw new IllegalStateException("Unexpected type: " + type); } return rng; }
@Override public int nextInt(int n) { if (n <= 0) { throw new IllegalArgumentException("n must be positive"); } // n is a power of 2 if ((n & -n) == n) { return (int) ((n * (long) next(31)) >> 31); } int bits, val; do { bits = next(31); val = bits % n; } while (bits - val + (n - 1) < 0); return val; }
@Override public double nextDouble() { return (nextLong() >>> 1) / (double) Long.MAX_VALUE; }