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