代码的实现是调用Random(0, 1)(即随机产生0,1)来实现Random(a, b),代码如下:    public static class RandomExtend
    {
        //private static Random random = new Random();        public static int RandomNumber(int min, int max)
        {
            if (min > max)
            {
                throw new InvalidOperationException("The max value must be great than max");
            }            Random random = new Random();
            int flag = random.Next(0, 2);            if (max - min <= 1)
            {
                return flag == 0 ? min : max; 
            }            int middle = (min + max) / 2;
            return flag == 0 ? RandomNumber(min, middle) : RandomNumber(middle + 1, max);
        }
    }这样如果调用RandomNumber(1, 10)的话就只会产生1或者10。说明后来的递归都是使用了第一次random.Next(0,2)产生的数
如果代码改成如下:    public static class RandomExtend
    {
        private static Random random = new Random();        public static int RandomNumber(int min, int max)
        {
            if (min > max)
            {
                throw new InvalidOperationException("The max value must be great than max");
            }            //Random random = new Random();
            int flag = random.Next(0, 2);            if (max - min <= 1)
            {
                return flag == 0 ? min : max; 
            }            int middle = (min + max) / 2;
            return flag == 0 ? RandomNumber(min, middle) : RandomNumber(middle + 1, max);
        }
    }这样就会随机产生1-10的数字。
请问出现这样的原因是什么呢。是否编译器做了优化?如果是,为什么要优化,好处是什么

解决方案 »

  1.   

    额,我上学期刚学的概率论,还是没看出来,我的问题是如果把Random类在方法内部实例化的话就会导致只产生头或者尾的数值。而作为静态成员的话就会出现预期的结果
      

  2.   

    哦,没仔细看。是这样的。如果定义成局部变量,因为程序运行数度很快,因此它们可能使用了同样的种子(种子根据时间获得)如果你需要用局部变量,可以这么写:
    Random random = new Random(Guid.NewID().GetHashCode());