protected internal static void init(SceMT19937 mt19937, int seed) { mt19937.mt[0] = seed; for (int mti = 1; mti < N; mti++) { mt19937.mt[mti] = 69069 * mt19937.mt[mti - 1]; } mt19937.mti = N; }
public virtual int sceMt19937Init(TPointer mt19937Addr, int seed) { SceMT19937 mt19937 = new SceMT19937(); MT19937.init(mt19937, seed); mt19937.write(mt19937Addr); return(0); }
public virtual int sceMt19937UInt(SceMT19937 mt19937) { int random = MT19937.getInt(mt19937); //if (log.DebugEnabled) { Console.WriteLine(string.Format("sceMt19937UInt returning 0x{0:X8}", random)); } mt19937.write(Memory.Instance); return(random); }
protected internal static int getInt(SceMT19937 mt19937) { if (mt19937.mti >= N) { // Generate N words at one time if (mt19937.mti == N + 1) { // init has not been called init(mt19937, 4357); } int kk; for (kk = 0; kk < N - M; kk++) { int y = (mt19937.mt[kk] & UPPER_MASK) | (mt19937.mt[kk + 1] & LOWER_MASK); mt19937.mt[kk] = mt19937.mt[kk + M] ^ ((int)((uint)y >> 1)) ^ mag01[y & 0x1]; } for (; kk < N - 1; kk++) { int y = (mt19937.mt[kk] & UPPER_MASK) | (mt19937.mt[kk + 1] & LOWER_MASK); mt19937.mt[kk] = mt19937.mt[kk + (M - N)] ^ ((int)((uint)y >> 1)) ^ mag01[y & 0x1]; } int y = (mt19937.mt[N - 1] & UPPER_MASK) | (mt19937.mt[0] & LOWER_MASK); mt19937.mt[N - 1] = mt19937.mt[M - 1] ^ ((int)((uint)y >> 1)) ^ mag01[y & 0x1]; mt19937.mti = 0; } long y = mt19937.mt[mt19937.mti++]; y ^= y >> TEMPERING_SHIFT_U; y ^= (y << TEMPERING_SHIFT_S) & TEMPERING_MASK_B; y ^= (y << TEMPERING_SHIFT_T) & TEMPERING_MASK_C; y ^= (y >> TEMPERING_SHIFT_L); return((int)y); }