当前位置:  编程技术>.net/c#/asp.net

Random连续产生相同随机数的解决方法

    来源: 互联网  发布时间:2014-08-30

    本文导语:  在编程产生随机数时遇到如下的奇怪问题。   代码如下: 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个...

在编程产生随机数时遇到如下的奇怪问题。
 

代码如下:
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个!

高手在民间啊,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( ) );


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util类random的类成员方法: random定义及介绍
  • 怎样将 math.random()转换为 整型(int)
  • java命名空间java.lang类strictmath的类成员方法: random定义及介绍
  • 请问Math.random()不能默认调用么
  • java命名空间java.lang类math的类成员方法: random定义及介绍
  • Math.random()的范围?
  • java命名空间java.util类random的类成员方法: nextlong定义及介绍
  • 请问一个random的问题
  • java命名空间java.util类random的类成员方法: nextint定义及介绍
  • J2ME Wirteless Toolkit下的又一个问题(用Math.Random()用不成!!!
  • java命名空间java.util类random的类成员方法: nextboolean定义及介绍
  • Random 谁会呀
  • java命名空间java.util类random的类成员方法: nextbytes定义及介绍
  • Oracle随机函数之dbms_random使用详解
  • java命名空间java.util类random的类成员方法: next定义及介绍
  • java命名空间java.util类random的类成员方法: nextdouble定义及介绍
  • java命名空间java.util类random的类成员方法: nextfloat定义及介绍
  • java命名空间java.util类random的类成员方法: nextgaussian定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3