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

哪种方法更好?

C#随机问题

版本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类用于创建一个对象,从中可以获得随机数序列