private void initialize()
        {
            // firstSeed is chosen based on clock() and used for the first rng
            ulong firstSeed = (ulong)DateTime.Now.Ticks;
            MersenneTwisterUniformRng first = new MersenneTwisterUniformRng(firstSeed);

            // secondSeed is as random as it could be
            // feel free to suggest improvements
            ulong secondSeed = first.nextInt32();

            MersenneTwisterUniformRng second = new MersenneTwisterUniformRng(secondSeed);

            // use the second rng to initialize the final one
            ulong        skip = second.nextInt32() % 1000;
            List <ulong> init = new InitializedList <ulong>(4);

            init[0] = second.nextInt32();
            init[1] = second.nextInt32();
            init[2] = second.nextInt32();
            init[3] = second.nextInt32();

            rng_ = new MersenneTwisterUniformRng(init);

            for (ulong i = 0; i < skip; i++)
            {
                rng_.nextInt32();
            }
        }
 public ulong get()
 {
     return(rng_.nextInt32());
 }