.net 为什么当我破译代码时,结果会不同

.net 为什么当我破译代码时,结果会不同,.net,vb.net,.net,Vb.net,我在VisualStudio2008中创建了一个小的vb.net控制台应用程序,试图学习.net,但当我插入代码并按F11单步执行时,结果会有所不同。如果我这样做,我期望得到的结果会显示出来,但是如果我不打断代码,结果就不是我期望的 基本上每次我点击一个按钮,我都想写四个随机数。如果我破译密码,这些会显示随机数,即1 3 4 3,但如果我不破译密码。我的号码都是一样的,即1 这是我的代码,就像我说的,我还在学习,所以逻辑可能不正确 Module Module1 Dim number1 As I

我在VisualStudio2008中创建了一个小的vb.net控制台应用程序,试图学习.net,但当我插入代码并按F11单步执行时,结果会有所不同。如果我这样做,我期望得到的结果会显示出来,但是如果我不打断代码,结果就不是我期望的

基本上每次我点击一个按钮,我都想写四个随机数。如果我破译密码,这些会显示随机数,即1 3 4 3,但如果我不破译密码。我的号码都是一样的,即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
模块1
Dim NUMBER 1为整数=0
Dim_dice作为布尔值=False
Dim NUMBER 2为整数=0
尺寸编号3为整数=0
尺寸编号4为整数=0
Dim numberArray()作为整数={number1,number2,number3,number4}
副标题()
Dim quit As Boolean=False
将cki设置为ConsoleKeyInfo
退出时执行=错误
如果dice=False,则
Console.WriteLine(“按任意键掷骰子…”)
cki=Console.ReadKey
如果cki.KeyChar“q”,则
退出=错误
其他的
退出=真
退出Do
如果结束
滚动()
dice=True
其他的
Console.WriteLine(“按任意键再次掷骰子…”)
cki=Console.ReadKey
如果cki.KeyChar“q”,则
退出=错误
其他的
退出=真
退出Do
如果结束
滚动()
如果结束
环
控制台。WriteLine(“游戏结束了!”)
Console.ReadKey()
端接头
私人分名册()
将新数字(4)设置为整数
Dim stringbuilder As String=“”
控制台。写入(“新编号:”)
Dim计数为整数=0
stringbuilder=“”
对于numberArray中作为整数的每个数字
newNumbers(count)=(generateRandomNumber(number))
stringbuilder+=(newNumbers(count).ToString()+“”)
计数+=1
下一个
Console.Write(stringbuilder)
端接头
专用函数GeneratorDomainNumber(ByVal数为整数)
Dim rand作为新的随机变量
数字=兰德。下一个(1,5)
返回号码
端函数
私有财产
得到
返回
结束
设置(ByVal值)
_骰子=价值
端集
端属性
端模块

有什么想法吗?谢谢

您正在为每个随机数创建一个新的
Random
实例

默认情况下,
Random
从当前时间创建种子。
您的代码运行速度足够快,所有的
随机
都得到相同的种子

当您单步执行时,这些步骤会在
Random
s之间添加暂停,因此它们会得到不同的种子


您应该在
共享
字段中重复使用相同的
随机
实例。

您正在为每个随机数创建一个新的
随机
实例

默认情况下,
Random
从当前时间创建种子。
您的代码运行速度足够快,所有的
随机
都得到相同的种子

当您单步执行时,这些步骤会在
Random
s之间添加暂停,因此它们会得到不同的种子

您应该在
共享
字段中重用相同的
随机
实例。

更改

Dim rand As New Random

Static rand As New Random

Random是按默认时间初始化的。为了获得不同的值,需要使用相同的对象。使用static,您的随机对象不会在每次调用“generateRandomNumber”时再次初始化

Dim rand As New Random

Static rand As New Random

Random是按默认时间初始化的。为了获得不同的值,需要使用相同的对象。使用static,您的随机对象不会在每次调用要读取的“generateRandomNumber”时再次初始化

当您在每次调用函数时创建一个新的随机对象时,它会从系统中获得一个种子,该种子来自系统时钟。这个种子决定了随机数的顺序,特别是第一个。相同的种子,相同的序列

因为你总是创建一个新的随机对象,所以你总是得到该实例的第一个数字。如果在调试模式下运行它,两个构造函数调用之间的时间足够长,可以产生不同的数字(因为使用了不同的种子,它取决于时钟)

如果让它正常运行,很可能会为每个新的随机对象获得相同的种子,从而获得相同的第一个随机数。如果运气好的话,你可能会一次得到两个不同的结果

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

您想阅读吗

当您在每次调用函数时创建一个新的随机对象时,它会从系统中获得一个种子,该种子来自系统时钟。这个种子决定了随机数的顺序,特别是第一个。相同的种子,相同的序列

因为你总是创建一个新的随机对象,所以你总是得到该实例的第一个数字。如果在调试模式下运行它,两个构造函数调用之间的时间足够长,可以产生不同的数字(因为使用了不同的种子,它取决于时钟)

如果让它正常运行,很可能会为每个新的随机对象获得相同的种子,从而获得相同的第一个随机数。如果运气好的话,你可能会一次得到两个不同的结果


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

在VB中,“静态”是“共享”的。您必须将局部变量
rand
转换为只初始化一次的共享模块成员。@Olivier Static在VB.NET中仍然可用。因此,您可以保留变量的范围