当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > c# Random快速连续产生相同随机数的解决方案

ASP.NET
在ASP.NET中自动给URL加上超级链接
在ASP.NET中怎么用Session判断用户是否登录?
C#是一种新的语言?或者仅仅只是Java
在网页中动态的生成一个图片
C#实现的18位身份证格式验证算法
Asp.net中的页面乱码的问题
ASP.NET中利用存储过程实现模糊查询
ASP.NET 2.0中构造个性化网页
.net教程:ASP.NET GridView的分页功能
ASP.Net中无刷新执行Session身份验证
用事实说话!AJAX应用程序开发七宗罪
迁移你的Web页面到ASP.NET AJAX 1.0
SQL Server 2005中插入XML数据方法
编程技巧 用Asp.net动态生成html页面
在asp.net 2.0 中使用的存储过程解析
用 asp.net 动态设置 WebService 引用
新手入门之ASP.NET2.0中的缓存技术解析
asp.net编程中实现 MD5 加密
ASP.NET备份恢复SqlServer数据库
Asp.Net输出数据到EXCEL表格中

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 74 ::
收藏到网摘: n/a

在写数独基类的时候为了产生随机数的时候遇到奇怪的问题 代码如下:
复制代码 代码如下:

namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Random d = new Random();
Console.WriteLine(d.Next(100));
}
}
}
}

理论上而言,这个程序会产生100个不同的0~100的整数,而实际情况却是除了第一个数字不同外,剩余99个数字会产生随机的99个相同的数字!而在中间加入调试点或者用MessageBox.show()的方式却能正确的得到100个不同的随机数!
为什么这样?难道要暂停一下子?于是修改代码:
复制代码 代码如下:

namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Random d = new Random();
Thread.Sleep(15);
Console.WriteLine(d.Next(100));
}
}
}
}

再次运行后,输出的数字终于随机了,而且15毫秒以上的暂停才会正常,如果只暂停1毫秒的话,会规律地出现连续5-6个一样的随机数,如果改成5毫秒的暂停的话,这种重复产生一样随机数的概率变成2-3个!
在网上苦苦搜索了2天,没什么帮助,而在CSDN论坛却很快有人给了解决方法:
复制代码 代码如下:

namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
Random d = new Random();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(d.Next(100));
}
}
}
}

把随机对象放在循环的外面就能解决问题!但还是没人能给个解释。估计果然是因为伪随机数的缘故,每次新产生随机种子的时候有时间的参与,所以才会在短时间内产生完全重复一致的“伪随机数”吧!
又及:网上看到一个提高随机数不重复概率的种子生成方法。
复制代码 代码如下:

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( ) );