import java.util.*; public class RandomX extends Random { private static final long[] x = { 1410651636l, 3012776752l, 3497475623l, 2892145026l, 1571949714l, 3253082284l, 3489895018l, 387949491l, 2597396737l, 1981903553l, 3160251843l, 129444464l, 1851443344l, 4156445905l, 224604922l, 1455067070l, 3953493484l, 1460937157l, 2528362617l, 317430674l, 3229354360l, 117491133l, 832845075l, 1961600170l, 1321557429l, 747750121l, 545747446l, 810476036l, 503334515l, 4088144633l, 2824216555l, 3738252341l, 3493754131l, 3672533954l, 29494241l, 1180928407l, 4213624418l, 33062851l, 3221315737l, 1145213552l, 2957984897l, 4078668503l, 2262661702l, 65478801l, 2527208841l, 1960622036l, 315685891l, 1196037864l, 804614524l, 1421733266l, 2017105031l, 3882325900l, 810735053l, 384606609l, 2393861397l }; private long[] y = new long[55]; private int j, k; //synchronized protected int next(int bits) //{ // seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); return (int)(seed >>> (48 - bits)); //} public RandomX() { int i; for (i = 0; i < 55; i++) y[i] = x[i]; j = 24 - 1; k = 55 - 1; } /** A 32 bit random number generator. An implementation in C of the algorithm given by Knuth, the art of computer programming, vol. 2, pp. 26-27. We use e=32, so we have to evaluate y(n) = y(n - 24) + y(n - 55) mod 2^32, which is implicitly done by unsigned arithmetic. */ synchronized protected int next(int bits) { long ul; ul = (y[k] += y[j]); if (--j < 0) j = 55 - 1; if (--k < 0) k = 55 - 1; return (int)(ul >>> (48 - bits)); } }