我正在尝试随机生成一个介于1和4之间(包括1和4)的数字,以随机选择一个对象(在本例中为小行星),并告诉它移动到一个位置并取消隐藏(生成)。
If Globals.pathA = True Then
Globals.astroidspawn_a1 = Random.Next(1, 4)
然后
If Globals.astroidspawn_a1 = 1 Then
astroid1.Location = New Point(800, 55)
astroid1.Visible = True
End If
第二部分重复多次,产生了大量的小行星。
代码"Random.Next"被视为一个代码错误,指出"引用非共享成员需要对象引用"。
您需要Random类的实例。优选的方法是使用Shared
变量,因为这提高了随机性。
在你的表格/班级中填写以下内容:
Private Shared _rnd As New Random
当你想要一个值时:
Globals.astroidspawn_a1 = _rnd.Next(1, 4)
Next()
是一个设计用于从Random
类的实例调用的函数。首先需要声明一个对象变量并对其进行初始化,然后对该对象变量调用Next()
。
修复代码的一种快速方法是在调用Next()
:之前根据需要实例化一个新的Random
类
If Globals.pathA = True Then
Dim randomizer = New Random()
Globals.astroidspawn_a1 = randomizer.Next(1, 4)
这种方法的一个缺点是,随机数并不是真正的随机数——它们被称为伪随机数,取种子值并根据种子生成新的数字。基于同一种子的数字序列每次都是相同的。在上面的例子中,默认种子值是基于时钟时间的,这意味着如果在循环内部调用它,它有可能连续多次生成相同的值。
一种解决方法是显式地将新种子传递给Random
对象构造函数,该构造函数不基于时钟时间。这里有一种方法:
If Globals.pathA = True Then
Dim randomizer = New Random(Guid.NewGuid().GetHashCode())
Globals.astroidspawn_a1 = randomizer.Next(1, 4)
这应该会创建真正的随机值,因为种子也会被随机化。