Implementation change to .NET's Random()

前端 未结 5 844
清歌不尽
清歌不尽 2021-01-11 09:25

I am migrating a method that is used for decoding from .NET Framework 1.1 to .NET Framework 4. I noticed that implementation of Random changed. So given the same seed, Rando

5条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-11 10:04

    You can just use Reflector to copy the Random class from the 1.1 mscorlib.

    public class Random1_1
    {
        // Fields
        private int inext;
        private int inextp;
        private const int MBIG = 0x7fffffff;
        private const int MSEED = 0x9a4ec86;
        private const int MZ = 0x0;
        private int[] SeedArray;
    
        // Methods
        public Random1_1()
            : this(Environment.TickCount)
        {
        }
    
        public Random1_1(int Seed)
        {
            this.SeedArray = new int[0x38];
            int num2 = 0x9a4ec86 - Math.Abs(Seed);
            this.SeedArray[0x37] = num2;
            int num3 = 0x1;
            for (int i = 0x1; i < 0x37; i++)
            {
                int index = (0x15 * i) % 0x37;
                this.SeedArray[index] = num3;
                num3 = num2 - num3;
                if (num3 < 0x0)
                {
                    num3 += 0x7fffffff;
                }
                num2 = this.SeedArray[index];
            }
            for (int j = 0x1; j < 0x5; j++)
            {
                for (int k = 0x1; k < 0x38; k++)
                {
                    this.SeedArray[k] -= this.SeedArray[0x1 + ((k + 0x1e) % 0x37)];
                    if (this.SeedArray[k] < 0x0)
                    {
                        this.SeedArray[k] += 0x7fffffff;
                    }
                }
            }
            this.inext = 0x0;
            this.inextp = 0x15;
            Seed = 0x1;
        }
    
        public virtual int Next()
        {
            return (int)(this.Sample() * 2147483647.0);
        }
    
        public virtual int Next(int maxValue)
        {
            if (maxValue < 0x0)
            {
                throw new ArgumentOutOfRangeException("maxValue");
            }
            return (int)(this.Sample() * maxValue);
        }
    
        public virtual int Next(int minValue, int maxValue)
        {
            if (minValue > maxValue)
            {
                throw new ArgumentOutOfRangeException("minValue");
            }
            int num = maxValue - minValue;
            if (num < 0x0)
            {
                long num2 = maxValue - minValue;
                return (((int)((long)(this.Sample() * num2))) + minValue);
            }
            return (((int)(this.Sample() * num)) + minValue);
        }
    
        public virtual void NextBytes(byte[] buffer)
        {
            if (buffer == null)
            {
                throw new ArgumentNullException("buffer");
            }
            for (int i = 0x0; i < buffer.Length; i++)
            {
                buffer[i] = (byte)(this.Sample() * 256.0);
            }
        }
    
        public virtual double NextDouble()
        {
            return this.Sample();
        }
    
        protected virtual double Sample()
        {
            int inext = this.inext;
            int inextp = this.inextp;
            if (++inext >= 0x38)
            {
                inext = 0x1;
            }
            if (++inextp >= 0x38)
            {
                inextp = 0x1;
            }
            int num = this.SeedArray[inext] - this.SeedArray[inextp];
            if (num < 0x0)
            {
                num += 0x7fffffff;
            }
            this.SeedArray[inext] = num;
            this.inext = inext;
            this.inextp = inextp;
            return (num * 4.6566128752457969E-10);
        }
    }
    

    Tested and it gives the desired output.

提交回复
热议问题