Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.math.BigInteger;
- public class MersenneTwister {
- private static final int N = 624;
- private static final int M = 397;
- private static final int MATRIX_A = 0x9908b0df;
- private static final int UPPER_MASK = 0x80000000;
- private static final int LOWER_MASK = 0x7fffffff;
- private int[] mt;
- private int mti;
- public MersenneTwister(int seed) {
- mt = new int[N];
- mt[0] = seed;
- for (mti = 1; mti < N; mti++) {
- mt[mti] = (1812433253 * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti);
- }
- }
- public int nextInt() {
- if (mti >= N) {
- int i;
- for (i = 0; i < N - M; i++) {
- int x = (mt[i] & UPPER_MASK) | (mt[i + 1] & LOWER_MASK);
- mt[i] = mt[i + M] ^ (x >> 1) ^ ((x & 1) * MATRIX_A);
- }
- for (; i < N - 1; i++) {
- int x = (mt[i] & UPPER_MASK) | (mt[i + 1] & LOWER_MASK);
- mt[i] = mt[i + (M - N)] ^ (x >> 1) ^ ((x & 1) * MATRIX_A);
- }
- int x = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
- mt[N - 1] = mt[M - 1] ^ (x >> 1) ^ ((x & 1) * MATRIX_A);
- mti = 0;
- }
- int y = mt[mti++];
- y ^= (y >> 11);
- y ^= (y << 7) & 0x9d2c5680;
- y ^= (y << 15) & 0xefc60000;
- y ^= (y >> 18);
- return y;
- }
- public double nextDouble() {
- long l = ((long) nextInt() << 32) + nextInt();
- return ((double) (l & 0x7fffffffffffffffL)) / ((double) 0x8000000000000000L);
- }
- public BigInteger nextBigInteger(int bitLength) {
- return new BigInteger(bitLength, this);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment