当我闯入代码时,为什么我的结果会有所不同?

时间:2011-11-21 14:18:11

标签: .net vb.net

我在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

有什么想法吗?感谢

3 个答案:

答案 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个不同的结果。

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