2017-04-27 40 views
-1

我想創建一個隨機值的數組,以便我可以對它們進行排序。問題是,隨機數發生器不工作,一遍又一遍地重複相同的數字。我之前使用過這種隨機數生成方法,它的工作很好。如果我將一個斷點放入CreateArray()循環的代碼中,那麼它工作得很好,但我必須手動完成代碼。我無法理解它是如何與斷點一起工作的,但是如果沒有一個斷點就無法工作。VB.net隨機數生成器重複相同的值

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 
+1

不要創建'新Random'每一次,一旦創建和GenerateRandomNumber' – Fabio

+0

的'所有執行重用'以緊密循環或快速連續的方式初始化兩個隨機數生成器會創建兩個隨機數生成器,這些生成器可以生成相同的隨機數序列。 [...]爲了提高性能並避免無意中創建生成相同數字序列的單獨隨機數生成器,我們建議您創建一個隨機對象隨時間生成許多隨機數,而不是創建新的隨機對象以生成一個隨機數number.' [MSDN](https://msdn.microsoft.com/en-us/library/system。隨機(V = vs.110)的.aspx) –

回答

1

不要創建新的隨機每一次,一旦創建和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

如果你總是在方法GenerateRandomNumberdefault constructor創建Random例如,它會使用當前時間作爲種子。如果你以非常快的速度調用該方法,那麼f.e.在循環中,您將始終生成相同的數字。

取而代之(1)將Random實例存儲在某個地方,例如在一個字段中,或者(2)將其作爲參數傳遞給該方法。

這在所有MSDN也被提及:

默認種子值從系統時鐘衍生,並且具有有限 分辨率。因此,通過調用默認構造函數關閉繼承而創建的中的不同隨機對象將具有相同的默認種子值,因此將產生相同的 組的隨機數。通過使用單個對象來生成所有隨機數,可以避免此問題。您還可以通過修改系統時鐘返回的種子值,然後 明確將此種子值提供給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