Naohiro19

MersenneTwister for Java

Feb 26th, 2023 (edited)
781
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.68 KB | None | 0 0
  1. import java.math.BigInteger;
  2.  
  3. public class MersenneTwister {
  4.     private static final int N = 624;
  5.     private static final int M = 397;
  6.     private static final int MATRIX_A = 0x9908b0df;
  7.     private static final int UPPER_MASK = 0x80000000;
  8.     private static final int LOWER_MASK = 0x7fffffff;
  9.  
  10.     private int[] mt;
  11.     private int mti;
  12.  
  13.     public MersenneTwister(int seed) {
  14.         mt = new int[N];
  15.         mt[0] = seed;
  16.         for (mti = 1; mti < N; mti++) {
  17.             mt[mti] = (1812433253 * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti);
  18.         }
  19.     }
  20.  
  21.     public int nextInt() {
  22.         if (mti >= N) {
  23.             int i;
  24.             for (i = 0; i < N - M; i++) {
  25.                 int x = (mt[i] & UPPER_MASK) | (mt[i + 1] & LOWER_MASK);
  26.                 mt[i] = mt[i + M] ^ (x >> 1) ^ ((x & 1) * MATRIX_A);
  27.             }
  28.             for (; i < N - 1; i++) {
  29.                 int x = (mt[i] & UPPER_MASK) | (mt[i + 1] & LOWER_MASK);
  30.                 mt[i] = mt[i + (M - N)] ^ (x >> 1) ^ ((x & 1) * MATRIX_A);
  31.             }
  32.             int x = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
  33.             mt[N - 1] = mt[M - 1] ^ (x >> 1) ^ ((x & 1) * MATRIX_A);
  34.             mti = 0;
  35.         }
  36.         int y = mt[mti++];
  37.         y ^= (y >> 11);
  38.         y ^= (y << 7) & 0x9d2c5680;
  39.         y ^= (y << 15) & 0xefc60000;
  40.         y ^= (y >> 18);
  41.         return y;
  42.     }
  43.  
  44.     public double nextDouble() {
  45.         long l = ((long) nextInt() << 32) + nextInt();
  46.         return ((double) (l & 0x7fffffffffffffffL)) / ((double) 0x8000000000000000L);
  47.     }
  48.  
  49.     public BigInteger nextBigInteger(int bitLength) {
  50.         return new BigInteger(bitLength, this);
  51.     }
  52. }
  53.  
Advertisement
Add Comment
Please, Sign In to add comment