随机对象中的随机数如何工作?

时间:2013-02-16 13:15:31

标签: c# object random

如果我有这个: (我已经宣布了变量)

random1 = new Random();
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random1.Next(1, 100));

当我有这个时,每次调用console.writeline时它都会生成一个不同的数字,所以这会生成ex。 10,55,如果你再次做20,60所以基本上随机数每次都很好。 但是,当我添加这个:

random2 = new Random();
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random2.Next(1, 100));
Console.WriteLine(random2.Next(1, 100));

Random1将生成与随机相同的数字!所以它将是前任。 5,54,5,54如果我再做70,34,70,34。但它的random2是一个新对象,为什么它生成与random1 ??

相同的数字

另一个例子: 如果我有这样的课程

 class RandomNumber
    {
        Random random = new Random();
        public int getrandomnumber { get { return random.Next(1, 5); } }
    }

完成此操作后

randomnumberobject = new RandomNumber();
randomnumberobject2 = new RandomNumber();
Console.WriteLine(randomnumberobject.getrandomnumber);
Console.WriteLine(randomnumberobject2.getrandomnumber);

它们会生成一个随机数,但它们都会产生完全相同的随机数。所以我第一次得到这个5,3秒这个3,3等等。 但是,如果我将课程改为此

class RandomNumber
    {
        Random random;
        public int getrandomnumber { get { return random.Next(1, 5); } }
        public RandomNumber(Random random) { this.random = random; }
    }

而这样做

   random = new Random();
   randomnumberobject = new RandomNumber(random);
   randomnumberobject2 = new RandomNumber(random);
   Console.WriteLine(randomnumberobject.getrandomnumber);
   Console.WriteLine(randomnumberobject2.getrandomnumber);

突然间,他们都产生了不同的随机数!那么为什么会这样呢?什么原因?请记住,我仍然是一个初学者。

3 个答案:

答案 0 :(得分:5)

你看到的是“按设计” - 即它是因为类的实现方式而发生的......它使用的算法需要一个“种子”(一种起始状态),在这种情况下是基于时钟......如MSDN所述:

  

随机数生成从种子值开始。如果相同   种子被重复使用,生成相同的数字序列。一   产生不同序列的方法是制作种子价值   与时间有关,从而与每个新系列产生不同的系列   随机的实例。默认情况下,无参数构造函数   随机类使用系统时钟生成其种子值,而   它的参数化构造函数可以取基于的Int32值   当前时间的刻度数。但是,因为时钟已经   有限分辨率,使用无参数构造函数创建   紧密连续的不同随机对象创建随机数   产生相同随机数序列的生成器。该   下面的例子说明了两个Random对象   紧密连续实例化生成一系列相同的   随机数。

这基本上意味着如果使用无参数构造函数几乎同时创建两个Random个对象,它们将产生相同的随机数序列,因为它们已基于相同的“起始状态”进行初始化。时钟。

答案 1 :(得分:0)

随机数生成基于大多数编程语言中的种子值。该种子通常取自当前时间值。因此,如果您声明两个Random对象彼此接近,则很可能它们将从CLR获得相同的种子。这就是他们生成相同数字的原因。

当您使用相同的实例时,前两个数字将来自随机序列,因此接下来的两个数字将不相同。

在这种情况下使用显式种子(使用int值重载的Random构造函数)。

答案 2 :(得分:0)

因为您在最后一个示例中每次重播,如果您没有重新设定随机对象,每次都会从同一个随机数池中拉出来。

        var random1 = new Random(DateTime.Now.Millisecond);
        Console.WriteLine(random1.Next(1, 100));
        Console.WriteLine(random1.Next(1, 100));
        Console.WriteLine(random1.Next(1, 100));
        Console.WriteLine(random1.Next(1, 100));

        var random2 = new Random(DateTime.Now.Millisecond);
        Console.WriteLine(random2.Next(1, 100));
        Console.WriteLine(random2.Next(1, 100));