c# Random快速连续产生相同随机数的解决方案

原文地址:http://www.jb51.net/article/17406.htm

在写随机数生成的时候遇到奇怪的问题

for (int i = 0; i < 100; i++) 
{ 
Random rd = new Random(); 
Console.WriteLine(rd.Next(100)); 
}


理论上而言,这个程序会产生100个不同的0~100的整数,而实际情况却是除了第一个数字不同外,剩余99个数字会产生随机的99个相同的数字!而在中间加入调试点却能正确的得到100个不同的随机数! 

为什么这样?难道要暂停一下子?于是添加代码: 

Thread.Sleep(15);

再次运行后,输出的数字终于随机了,而且15毫秒以上的暂停才会正常,如果只暂停1毫秒的话,会规律地出现连续5-6个一样的随机数,如果改成5毫秒的暂停的话,这种重复产生一样随机数的概率变成2-3个! 

在网上有人给了解决方法:

把随机对象放在循环的外面就能解决问题!但还是没人能给个解释。估计果然是因为伪随机数的缘故,每次新产生随机种子的时候有时间的参与,所以才会在短时间内产生完全重复一致的“伪随机数”吧! 

又及:网上看到一个提高随机数不重复概率的种子生成方法。

static int GetRandomSeed( ) 
{ 
byte[] bytes = new byte[4]; 
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider( ); 
rng.GetBytes( bytes ); 
return BitConverter.ToInt32( bytes , 0 ); 
} 

Random random = new Random( GetRandomSeed( ) ); 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值