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

Csh*_*ion 3 c# random object

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

random1 = new Random();
Console.WriteLine(random1.Next(1, 100));
Console.WriteLine(random1.Next(1, 100));
Run Code Online (Sandbox Code Playgroud)

当我拥有它时,每次调用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));
Run Code Online (Sandbox Code Playgroud)

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); } }
    }
Run Code Online (Sandbox Code Playgroud)

这样做之后

randomnumberobject = new RandomNumber();
randomnumberobject2 = new RandomNumber();
Console.WriteLine(randomnumberobject.getrandomnumber);
Console.WriteLine(randomnumberobject2.getrandomnumber);
Run Code Online (Sandbox Code Playgroud)

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

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

而是这样做

   random = new Random();
   randomnumberobject = new RandomNumber(random);
   randomnumberobject2 = new RandomNumber(random);
   Console.WriteLine(randomnumberobject.getrandomnumber);
   Console.WriteLine(randomnumberobject2.getrandomnumber);
Run Code Online (Sandbox Code Playgroud)

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

Yah*_*hia 5

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

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

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