vb.net:对非共享成员的引用需要一个对象引用.引用出现在random.next中



我正在尝试随机生成一个介于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)

这应该会创建真正的随机值,因为种子也会被随机化。

相关内容

最新更新