Esempio n. 1
0
        public double getNextDouble(rk_state state)
        {
            /* shifts : 67108864 = 0x4000000, 9007199254740992 = 0x20000000000000 */
            ulong a = getNextUInt64(state) >> 5;
            ulong b = getNextUInt64(state) >> 6;

            return((a * 67108864.0 + b) / 9007199254740992.0);
        }
Esempio n. 2
0
 public void Seed(ulong?seedValue, rk_state state)
 {
     if (seedValue.HasValue)
     {
         rnd = new Random((int)seedValue.Value);
     }
     else
     {
         rnd = new Random();
     }
     return;
 }
Esempio n. 3
0
        public ulong getNextUInt64(rk_state state)
        {
            /* Magic Mersenne Twister constants */
            const int   N          = 624;
            const int   M          = 397;
            const ulong MATRIX_A   = 0x9908b0dfUL;
            const ulong UPPER_MASK = 0x80000000UL;
            const ulong LOWER_MASK = 0x7fffffffUL;

            ulong y;

            if (state.pos == RK_STATE_LEN)
            {
                int   i;
                long  ly;
                ulong uy;

                for (i = 0; i < N - M; i++)
                {
                    y      = (key[i] & UPPER_MASK) | (key[i + 1] & LOWER_MASK);
                    ly     = (long)(y & 1);
                    uy     = (ulong)-ly;
                    key[i] = key[i + M] ^ (y >> 1) ^ (uy & MATRIX_A);
                }
                for (; i < N - 1; i++)
                {
                    y      = (key[i] & UPPER_MASK) | (key[i + 1] & LOWER_MASK);
                    ly     = (long)(y & 1);
                    uy     = (ulong)-ly;
                    key[i] = key[i + (M - N)] ^ (y >> 1) ^ (uy & MATRIX_A);
                }
                y          = (key[N - 1] & UPPER_MASK) | (key[0] & LOWER_MASK);
                ly         = (long)(y & 1);
                uy         = (ulong)-ly;
                key[N - 1] = key[M - 1] ^ (y >> 1) ^ (uy & MATRIX_A);


                state.pos = 0;
            }
            y = key[state.pos++];

            /* Tempering */
            y ^= (y >> 11);
            y ^= (y << 7) & 0x9d2c5680UL;
            y ^= (y << 15) & 0xefc60000UL;
            y ^= (y >> 18);

            return(y);
        }
Esempio n. 4
0
        public void Seed(ulong?inseed, rk_state state)
        {
            uint pos;

            if (!inseed.HasValue)
            {
                inseed = (ulong)DateTime.Now.Ticks;
            }

            ulong seed = inseed.Value;

            seed &= 0xffffffffUL;

            /* Knuth's PRNG as used in the Mersenne Twister reference implementation */
            for (pos = 0; pos < RK_STATE_LEN; pos++)
            {
                key[pos] = seed;
                seed     = (1812433253UL * (seed ^ (seed >> 30)) + pos + 1) & 0xffffffffUL;
            }
            state.pos          = RK_STATE_LEN;
            state.gauss        = 0;
            state.has_gauss    = false;
            state.has_binomial = false;
        }
Esempio n. 5
0
        public ulong getNextUInt64(rk_state state)
        {
            ulong randomValue = (ulong)rnd.Next() << 32 + rnd.Next();

            return(randomValue);
        }
Esempio n. 6
0
 public double getNextDouble(rk_state state)
 {
     return(rnd.NextDouble());
 }