fix distributed KMeans bugs and add javasingle version
[IRC.git] / Robust / src / Benchmarks / Prefetch / KMeans / javasingle / Random.java
1 public class Random {
2   int[] mt; 
3   int mti;
4   int RANDOM_DEFAULT_SEED;
5   /* period parameter */
6   int N;
7   int M;
8   int MATRIX_A;
9   int UPPER_MASK;
10   int LOWER_MASK;
11   int[] mag01;
12
13   public Random() {
14     RANDOM_DEFAULT_SEED = 0;
15     N = 624;
16     M = 397;
17     mt = new int[N];
18     mti = N;
19     MATRIX_A = 0x9908b0df;   /* constant vector a */
20     UPPER_MASK = 0x80000000; /* most significant w-r bits */
21     LOWER_MASK = 0x7fffffff; /* least significant r bits */
22     mag01 = new int[2];
23     mag01[0] = 0x0;
24     mag01[1] = MATRIX_A;
25
26   }
27
28   public void random_alloc() {
29     init_genrand(this.RANDOM_DEFAULT_SEED);
30   }
31
32   /* initializes mt[N] with a seed */
33   public void init_genrand(int s) {
34     mt[0]= s & 0xFFFFFFFF;
35     for (int mti=1; mti<N; mti++) {
36      mt[mti] = (1812433253 * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
37       /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
38       /* In the previous versions, MSBs of the seed affect   */
39       /* only MSBs of the array mt[].                        */
40       /* 2002/01/09 modified by Makoto Matsumoto             */
41       mt[mti] &= 0xFFFFFFFF;
42       /* for >32 bit machines */
43     }
44     this.mti=mti;
45   }
46
47   public void random_seed(int seed) {
48     init_genrand(seed);
49   }
50
51   public int random_generate() {
52     return genrand_int32();
53   }
54
55   public int posrandom_generate() {
56     int r=genrand_int32();
57     if (r>0)
58       return r;
59     else 
60       return -r;
61   }
62
63   public int genrand_int32() {
64     int y;
65     int mti = this.mti;
66
67     /* mag01[x] = x * MATRIX_A  for x=0,1 */
68
69     if (mti >= 624) { /* generate N words at one time */
70       int kk;
71       int[] mt = this.mt;
72
73       if (mti == 624+1)   /* if init_genrand() has not been called, */
74         init_genrand(5489); /* a default initial seed is used */
75
76       for (kk=0;kk<(624-397);kk++) {
77         y = (mt[kk]&0x80000000)|(mt[kk+1]&0x7fffffff);
78         mt[kk] = mt[kk+397] ^ (y >> 1) ^ ((y & 0x1)==0 ? 0:0x9908b0df);
79       }
80       for (;kk<(624-1);kk++) {
81         y = (mt[kk]&0x80000000)|(mt[kk+1]&0x7fffffff);
82         mt[kk] = mt[kk+(397-624)] ^ (y >> 1) ^ ((y & 0x1)==0 ? 0:0x9908b0df);
83       }
84       y = (mt[624-1]&0x80000000)|(mt[0]&0x7fffffff);
85       mt[624-1] = mt[397-1] ^ (y >> 1) ^ ((y & 0x1)==0 ? 0:0x9908b0df);
86
87       mti = 0;
88     }
89
90     y = mt[mti++];
91
92     /* Tempering */
93     y ^= (y >> 11);
94     y ^= (y << 7) & 0x9d2c5680;
95     y ^= (y << 15) & 0xefc60000;
96     y ^= (y >> 18);
97
98     this.mti = mti;
99
100     return y;
101   }
102 }