Random产生重复伪随机数的真正原因 并非时间问题

之前在产生随机数的运用场景中,如果我们把实例化Random累的语句放在循环体内,会产生非常多的相同的随机数。许多人解释为:这是由于循环执行速度非常快,导致种子(以当前系统时间获得的某个数值)未来得及变化,所以出现了这种情况。这种解释其实是错误的。举个变态的例子:

            Random rand = new Random(10);
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));
            Console.WriteLine(rand.Next(4));

这样子做的输出结果会发现,相同的种子,却产生了不一样的随机数,并不是“相同种子产生一个相同随机数”这种说法。其实,同一个Random被初始化后,若不重新初始化,每调一次Next()方法将生产不同的随机数,同一个种子,Next()处理就有随机性,对同一个rand对象,有累计的效果,这和播种不一样,并不是一个种子只能种下一个随机数。而在循环里面初始化Rand,每次循环就会重新以相同的种子初始化rand,也就是说rand每次都被初始化为最原始的状态,如果说我上面的代码下来产生了这么多个随机数,而生成的随机数在相同的种子情况下,都将采用这个随机数序列的第一个。也就是说,如果我们想要得到不同的随机数,那么我们就应该,只初始化一次Rand.

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值