zoukankan      html  css  js  c++  java
  • c# Random快速连续产生相同随机数的解决方案

     

    在写数独基类的时候为了产生随机数的时候遇到奇怪的问题

    代码如下:

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

     

    -引用--

     

            Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字,后者可以自己设定触发的种子,一般都是用UnCheck((Int)DateTime.Now.Ticks)做为参数种子,因此如果计算机运行速度很快,如果触发Randm函数间隔时间很短,就有可能造成产生一样的随机数,因为伪随机的数字,在Random的内部产生机制中还是有一定规律的,并非是真正意义上的完全随机。

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

    1、延时的办法。

    可以采用for循环的办法,也可以采用Thread.Sleep(100);

    2、提高随机数不重复概率的种子生成方法:

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

  • 相关阅读:
    转:用十条命令在一分钟内检查Linux服务器性能
    android适配的努力
    转: Android Studio你不知道的调试技巧
    编码处理过滤器
    PageBean分页组件
    BaseServlet方法分发
    SQLHelper、DBUtil终极封装
    JavaEE面试题库
    Servlet、JSP选择题(2)
    Servlet、JSP选择题
  • 原文地址:https://www.cnblogs.com/dudu837/p/1383107.html
Copyright © 2011-2022 走看看