.Net中关于Random类产生的随机数相同问题解决

    技术2022-05-11  6

        本人在用到Random对象产生随进数,结果得到100个都是一样的,感觉奇怪。查询MSDN后发现如下:

    Random 构造函数是使用与时间相关的默认种子值,初始化Random 类的新实例的。与时间相关??

        生成的数字分布均匀;每个数字返回的可能性均相等。

    默认种子值是从系统时钟派生而来的,具有有限的分辨率。因此,通过调用默认构造函数而频繁创建的不同 Random 对象将具有相同的默认种子值,因而会产生几组相同的随机数。使用单个 Random 对象生成所有随机数可以避免此问题,NexBytes方法可以解决此相同问题。

        示例

        下面的示例使用默认构造函数实例化三个 Random 对象,并为每个对象显示由五个随机整数组成的序列。由于前两个 Random 对象是连续创建的,它们是用基于系统时钟的相同种子值实例化的,因此会生成相同的随机数序列。相反,第三个 Random 对象的默认构造函数是在调用 Thread..::.Sleep 方法产生两秒的延迟后调用的。这样,为第三个 Random 对象生成了不同的种子值,从而生成不同的随机数序列。

    using System; using System.Threading; public class RandomNumbers { public static void Main() { Random rand1 = new Random(); Random rand2 = new Random(); Thread.Sleep(2000); Random rand3 = new Random(); ShowRandomNumbers(rand1); ShowRandomNumbers(rand2); ShowRandomNumbers(rand3); } private static void ShowRandomNumbers(Random rand) { Console.WriteLine(); byte[] values = new byte[5]; rand.NextBytes(values); foreach (byte value in values) Console.Write("{0, 5}", value); Console.WriteLine(); } } // The example displays the following output to the console: // 28 35 133 224 58 // // 28 35 133 224 58 // // 32 222 43 251 49

     

    通过创建单个而不是多个 Random 对象可以避免此问题。

    若要提高性能,请创建一个随时间推移能生成多个随机数的 Random 对象,而不要反复新建会生成同一个随机数的 Random 对象。

    例如,要生成适合于创建随机密码的加密安全随机数,请使用从 System.Security.Cryptography..::.RandomNumberGenerator 派生的类,如 System.Security.Cryptography..::.RNGCryptoServiceProvider

    对继承者的说明:

    在 .NET Framework 1.0 和 1.1 版中,派生自 Random 的类的最小实现需要重写 Sample 方法,以定义用于生成随机数的新算法或修改算法。然后,该派生类便可依赖 Random..::.Next()()()Random..::.Next(Int32)Random..::.Next(Int32, Int32)NextBytesNextDouble 方法的基类实现来调用 Sample 方法的派生类实现。

    在 .NET Framework 2.0 及更高版本中,Random..::.Next()()()Random..::.Next(Int32, Int32)NextBytes 方法的行为发生了更改,因此这些方法不必再调用 Sample 方法的派生类实现。因此,派生自 Random 并且面向 .NET Framework 2.0 及更高版本的类还应重写这三种方法。

     示例

    下面的示例创建单个随机数生成器,并调用其 NextBytesNextNextDouble 方法来生成不同范围内的随机数序列。

     

     来自官方文档,这个只能产生0-255的随机数。发觉和java的Math.Random()……呀!倒没有试过java的连续产生随机数是不是也类似。


    最新回复(0)