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

本文详细解析了C#中Random类的工作原理,包括如何避免创建多个Random实例导致生成相同随机数序列的问题。提供了实例代码展示如何正确使用Random类。

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

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

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

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

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

 

通过创建单个而不是多个 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的连续产生随机数是不是也类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值