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