C#随机问题
本文关键字:问题 随机 | 更新日期: 2023-09-27 18:01:54
我有两个不同的实现随机函数:
版本1:
public double myRnd()
{
Random rnd = new Random();
return rnd.NextDouble();
}
//-- Generate Random Number for Delaer
double DealersCard = myRnd();
//-- Generate Players 4 Random Number
double Box1Card = myRnd();
double Box2Card = myRnd();
double Box3Card = myRnd();
double Box4Card = myRnd();
版本2:
//-- Create Random Object
var rnd = new Random();
//-- Generate Random Number for Delaer
double DealersCard = rnd.NextDouble();
//-- Generate Players 4 Random Number
double Box1Card = rnd.NextDouble();
double Box2Card = rnd.NextDouble();
double Box3Card = rnd.NextDouble();
double Box4Card = rnd.NextDouble();
哪种方法更好?
版本2比好得多。版本1完全崩溃了。
版本1为每个编号重新创建Random
。CCD_ 2由每1-16ms变化一次的CCD_。因此,在该时间间隔内,对myRnd
的所有调用都将获得相同的随机数。
此外,版本2更快,因为它不需要重新创建Random
。
类似的问题经常被问到,通常是那些实现版本1的人,他们想知道为什么它不适用。例如:随机数生成器只生成一个随机数
Random
的MSDN文档指出:
随机数的生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而用Random的每个新实例产生不同的序列。默认情况下,Random类的无参数构造函数使用系统时钟来生成其种子值,而其参数化构造函数可以根据当前时间的节拍数取Int32值。然而,由于时钟的分辨率有限,使用无参数构造函数连续创建不同的随机对象会创建随机数生成器,生成相同的随机数序列。
http://msdn.microsoft.com/en-us/library/system.random.aspx
我已经对Microsoft Connect提出了改进请求,因为这是一个非常常见的错误。
第一个不太好用。
any随机函数的要点是它是伪随机的,并且你得到的随机值取决于种子。创建Random
对象时,将使用当前时间对其进行种子设定。
因此,当您每次想要一个随机数时都创建一个新的Random
对象时,您最终会一次又一次地使用当前时间进行种子设定,这可能会导致重复获得相同的数字(因为当前时间可能没有改变,这取决于它使用的计时器的精度和分辨率(。
Random
类用于创建一个对象,从中可以获得随机数序列。