2011-11-21 38 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个不同的结果。

每次运行应用程序时只创建一个这些随机对象,此效果将消失。

相关问题