VB.NET随机数生成器正在重复相同的值



我正在尝试创建一个随机值数组,以便我可以对它们进行排序。问题是,随机数生成器无法正常工作,并且一遍又一遍地重复相同的数字。我以前使用过这种随机数生成的方法,并且效果很好。如果我在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

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

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

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

如果您始终使用默认构造函数在方法GenerateRandomNumber中创建Random实例,它将将当前时间用作种子。如果您非常快地调用该方法,F.E.在循环中,您将始终生成相同的数字。

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

MSDN中也提到了这一切:

默认种子值是从系统时钟得出的,并且具有有限的 解决。结果,在 拨打默认构造函数的呼叫将与 相同的默认种子值,因此将产生相同的 一组随机数。可以通过使用单个来避免此问题 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

最新更新