我在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
有什么想法吗?感谢
答案 0 :(得分:6)
您正在为每个随机数创建一个新的Random
实例。
默认情况下,Random
会根据当前时间创建种子
您的代码运行得足够快,以至于所有Random
都获得相同的种子。
当您单步执行时,这些步骤会在Random
之间添加暂停,因此它们会获得不同的种子。
您应该在Random
字段中重复使用相同的Shared
实例。
答案 1 :(得分:2)
更改
Dim rand As New Random
要
Static rand As New Random
随机是默认时间初始化。为了获得不同的值,您需要使用相同的Object。对于静态,每次调用“generateRandomNumber”
时,随机对象不会再次初始化答案 2 :(得分:0)
你想读 http://msdn.microsoft.com/en-us/library/h343ddh9.aspx
当您每次调用函数创建一个新的Random对象时,它会从系统中获取一个从系统时钟派生的种子。该种子确定随机数的序列,特别是第一个。相同的种子,相同的序列。
由于您总是创建一个新的随机对象,因此您始终可以获得该实例的第一个数字。如果在调试模式下运行它,两个构造函数调用之间的时间足够长,以产生不同的数字(因为使用了不同的种子,它取决于时钟)。
如果你让它正常运行,你很可能为每个新的随机对象获得相同的种子,因此相同的第一个随机数。幸运的话,你可以一次性得到2个不同的结果。
每次运行应用程序时,只创建其中一个随机对象,此效果将消失。