如果我有这个: (我已经宣布了变量)
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);
突然间,他们都产生了不同的随机数!那么为什么会这样呢?什么原因?请记住,我仍然是一个初学者。
答案 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));