您的位置:首页 > 其它

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

2009-07-26 20:34 561 查看
本人在用到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)、NextBytes 和 NextDouble 方法的基类实现来调用 Sample 方法的派生类实现。

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


示例

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

来自官方文档,这个只能产生0-255的随机数。发觉和java的Math.Random()……呀!倒没有试过java的连续产生随机数是不是也类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: