示例#1
0
 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;
 }
示例#2
0
        public virtual int sceMt19937Init(TPointer mt19937Addr, int seed)
        {
            SceMT19937 mt19937 = new SceMT19937();

            MT19937.init(mt19937, seed);
            mt19937.write(mt19937Addr);

            return(0);
        }
示例#3
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);
        }
示例#4
0
            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);
            }