为什么这不是随机的?

时间:2013-11-21 18:21:13

标签: vb.net random

我正在尝试使用Random.net使用VB.net生成一组10个随机数。

For i As Integer = 0 To 10
    Console.WriteLine("Random {0}: {1}", i, (New Random).Next(1, 100))
Next

此代码迭代10次,每次使用随机类的新实例生成1到100之间的整数,并将其输出到控制台。

然而,结果肯定不是随机的:

Console Output

值得注意的是,每次运行子程序时,数字34都会改变。

这是为什么? 是因为我在每次迭代时都在创建一个随机类的新实例吗?如果是这样,为什么会导致问题?

3 个答案:

答案 0 :(得分:5)

我认为MSDN文档描述了为什么这种情况发生得相当好。 http://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx

  

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

答案 1 :(得分:2)

这将解决它。 Random类使用种子(只是一个整数)来生成其随机数。具有相同种子的两个随机对象将生成相同的数字。使用Static变量可以解决此问题。

现在,如果您没有在构造函数中提供种子,则默认情况下种子来自Environment.TickCount

Static rnd As New Random
For i As Integer = 0 To 10
  Console.WriteLine("Random {0}: {1}", i, (rnd.Next(1, 100))
Next

答案 2 :(得分:0)

您可以尝试这样:

Static r As New Random
For i As Integer = 0 To 10
  Console.WriteLine("Random {0}: {1}", i, (r.Next(1, 100))
Next

来自MSDN

  

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