2011-11-21 37 views
1

我在Visual Studio 2008中創建了一個小vb.net控制檯應用程序的代碼努力學習.NET,但我的研究結果表明不同的,當我在代碼,然後按F11突破步。如果我這樣做,我期望得到的結果會顯示出來,但如果我沒有闖入代碼,結果並不是我期望的結果。爲什麼我的結果不同,當我打入

基本上每次我點擊一個按鈕我想寫四個隨機的數字。如果我闖入代碼,這些顯示隨機數字,即1 3 4 3,但如果我不闖入代碼。我的號碼都是一樣的,即1 1 1 1

這裏是我的代碼,就像我說我還在學習,因此邏輯可能是不正確的。

Module Module1 

Dim number1 As Integer = 0 
Dim _DiceRolled As Boolean = False 
Dim number2 As Integer = 0 
Dim number3 As Integer = 0 
Dim number4 As Integer = 0 
Dim numberArray() As Integer = {number1, number2, number3, number4} 

Sub Main() 

    Dim quit As Boolean = False 
    Dim cki As ConsoleKeyInfo 
    Do While quit = False 
     If diceRolled = False Then 
      Console.WriteLine("Press any key to roll the dice...") 

      cki = Console.ReadKey 


      If cki.KeyChar <> "q" Then 
       quit = False 
      Else 
       quit = True 
       Exit Do 
      End If 

      roll() 
      diceRolled = True 

     Else 
      Console.WriteLine("Press any key to roll the dice again...") 
      cki = Console.ReadKey 
      If cki.KeyChar <> "q" Then 
       quit = False 
      Else 
       quit = True 
       Exit Do 
      End If 

      roll() 
     End If 
    Loop 
    Console.WriteLine(" Game is over!") 
    Console.ReadKey() 


End Sub 


Private Sub roll() 
    Dim newNumbers(4) As Integer 
    Dim stringbuilder As String = "" 
    Console.Write(" New numbers : ") 
    Dim count As Integer = 0 
    stringbuilder = "" 

    For Each number As Integer In numberArray 


     newNumbers(count) = (generateRandomNumber(number)) 
     stringbuilder += (newNumbers(count).ToString() + " ") 
     count += 1 

    Next 
    Console.Write(stringbuilder) 
End Sub 

Private Function generateRandomNumber(ByVal number As Integer) 
    Dim rand As New Random 
    number = rand.Next(1, 5) 
    Return number 
End Function 

Private Property diceRolled() 
    Get 
     Return _DiceRolled 
    End Get 
    Set(ByVal value) 
     _DiceRolled = value 
    End Set 
End Property 


End Module 

任何想法?謝謝

回答

6

您正在爲每個隨機數製作一個新的Random實例。

默認情況下,Random創建從當前時間的種子。
您的代碼運行速度足夠快,以至於所有的Random都獲得相同的種子。

當你通過它一步,步驟添加暫停Random S之間,使他們獲得不同的種子。

你應該重複使用相同Random例如在Shared場。

+0

非常感謝,它現在的工作 – mjroodt

2

變化

Dim rand As New Random

Static rand As New Random

隨機爲每初始化默認時間。爲了獲得不同的值,你需要使用相同的對象。對於靜態您隨機對象不會再次與每次調用「generateRandomNumber」

+0

「靜態」是VB中的「共享」。你將不得不將局部變量'rand'轉換成只被初始化一次的共享模塊成員。 –

+2

@Olivier靜態在VB.NET中仍然可用。所以你可以保持局部變量的範圍。 – Nicholas

+0

你是對的(+1)。 –

0

你想讀的初始化 http://msdn.microsoft.com/en-us/library/h343ddh9.aspx

當您使用每次調用你的功能一個新的隨機對象,它得到的種子來自系統,來源於系統時鐘。這個種子決定了隨機數的序列,特別是第一個。相同的種子,相同的序列。

既然你總是創建一個新的隨機對象,你總是會得到該實例的第一個數字。如果以調試模式運行它,則兩次構造函數調用之間的時間足夠長以產生不同的數字(因爲使用了不同的種子,它與時鐘相關)。

如果你讓它運行正常,你很可能會獲得每個新的隨機對象相同的種子,因此相同的第一隨機數。幸運的是,你可能會一次得到2個不同的結果。

每次運行應用程序時只創建一個這些隨機對象,此效果將消失。

相關問題