3

如果我有这个:(我已经声明了变量)

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,5 第二次这个 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);

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

4

3 回答 3

5

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

随机数生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而为每个新的 Random 实例产生不同的序列。默认情况下,Random 类的无参构造函数使用系统时钟生成其种子值,而其有参构造函数可以根据当前时间的刻度数取一个 Int32 值。但是,由于时钟的分辨率有限,因此使用无参数构造函数以紧密连续的方式创建不同的 Random 对象会创建生成相同随机数序列的随机数生成器。

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

于 2013-02-16T13:21:18.237 回答
0

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

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

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

于 2013-02-16T13:23:30.123 回答
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));
于 2013-02-16T13:23:32.500 回答