VB.net随机数生成器重复相同的值

时间:2017-04-27 08:30:10

标签: vb.net sorting random

我正在尝试创建一个随机值数组,以便我可以对它们进行冒泡排序。问题是,随机数生成器不工作并反复重复相同的数字。我之前使用过这种随机数生成方法,它工作得很好。如果我在CreateArray()循环中的代码中放置一个断点,那么它工作正常,但我必须手动单步执行代码。我无法理解它如何与断点一起工作,但没有断点就无法工作。

Sub Main()
    Dim Value_Array As New List(Of Integer)
    Dim No_Of_Items As Integer = 10
    Dim Pass_No As Integer = 1
    Dim Temp As Integer
    Value_Array = CreateArray(No_Of_Items)
    For Pass_No = 1 To (No_Of_Items - 1)
        For j = 0 To (No_Of_Items - (Pass_No + 1))
            If Value_Array(j) > Value_Array(j + 1) Then
                Temp = Value_Array(j)
                Value_Array(j) = Value_Array(j + 1)
                Value_Array(j + 1) = Temp
            End If
        Next
    Next
    For i = 0 To (No_Of_Items - 1)
        Console.Write(Value_Array(i) & ", ")
    Next
    Console.ReadKey()
End Sub
Function GenerateRandomNumber()
    Dim Random_Number As Random = New Random()
    Dim Random As Integer = Random_Number.Next(0, 101)
    Return Random
End Function
Function CreateArray(No_Of_Items)
    Dim Count As Integer = 0
    Dim Temp_Array As New List(Of Integer)
    Do Until Count = No_Of_Items
        Temp_Array.Add(GenerateRandomNumber())
        Count = Count + 1
    Loop
    Return Temp_Array
End Function

2 个答案:

答案 0 :(得分:2)

每次都不要创建New Random,创建一次并在GenerateRandomNumber的所有执行中重复使用。
New Random()将使用当前时间作为生成的随机数的种子。使用相同种子创建的Random实例将生成相同的随机数。 循环执行速度非常快,因此每次创建Random的新实例时,它都将使用相同的时间种子,并且所有实例都将生成相同的数字。

您可以使用Static声明仅对方法的所有执行使用一个实例

Function GenerateRandomNumber() As Integer
    Static Random_Number As New Random()
    Return Random_Number.Next(0, 101)
End Function

答案 1 :(得分:1)

如果您始终使用default constructor在方法Random中创建GenerateRandomNumber实例,则会将当前时间用作种子。如果你非常快地调用该方法,f.e。在循环中,您将始终生成相同的数字。

而是(1)将Random实例存储在某处,例如存储在字段中,或者(2)将其作为参数传递给方法。

MSDN中也提到了这一切:

  

默认种子值来自系统时钟并具有有限性   解析度。因此,在中创建的不同Random对象   通过调用默认构造函数来关闭连续   相同的默认种子值,因此,将产生相同的   随机数集。使用单个可以避免此问题   Random对象生成所有随机数。你也可以解决   它通过修改系统时钟返回的种子值然后   明确地向Random(Int32)提供此新种子值   构造

所以这里是选项2的例子:

Function GenerateRandomNumber(random As Random) As Int32
    Dim randomNumber As Integer = random.Next(0, 101)
    Return randomNumber
End Function

...

Dim rnd As New Random()

Do Until Count = No_Of_Items
    Temp_Array.Add(GenerateRandomNumber(rnd))
    Count = Count + 1
Loop