首页 > 解决方案 > Visual Basic:老虎机值都返回相同的值

问题描述

我试图在 Visual Basic Windows Form Creator 中创建一个简单的老虎机。到目前为止,这是我的代码:

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim List1 = New String() {"Banana", "Cherry", "Watermelon", "Bell", "Skull", "Apricot"}
        Dim List2 = New String() {"Banana", "Cherry", "Watermelon", "Bell", "Skull", "Apricot"}
        Dim List3 = New String() {"Banana", "Cherry", "Watermelon", "Bell", "Skull", "Apricot"}
        Dim rn1 = New Random()
        Dim rn2 = New Random()
        Dim rn3 = New Random()
        Dim x As Integer = 0
        While x < 30
            Dim Choice = List1(rn1.Next(0, List1.Count))
            Dim Choice2 = List2(rn2.Next(0, List2.Count))
            Dim Choice3 = List3(rn3.Next(0, List3.Count))

            Select Case Choice
                Case "Banana"
                    Slot1.Image = Fruit_Machine.My.Resources.Resources.Banana
                Case "Cherry"
                    Slot1.Image = Fruit_Machine.My.Resources.Resources.Cherry
                Case "Watermelon"
                    Slot1.Image = Fruit_Machine.My.Resources.Resources.Watermelon
                Case "Skull"
                    Slot1.Image = Fruit_Machine.My.Resources.Resources.Skull
                Case "Apricot"
                    Slot1.Image = Fruit_Machine.My.Resources.Resources.Apricot
                Case "Bell"
                    Slot1.Image = Fruit_Machine.My.Resources.Resources.Bell
            End Select
            Select Case Choice2
                Case "Banana"
                    Slot2.Image = Fruit_Machine.My.Resources.Resources.Banana
                Case "Cherry"
                    Slot2.Image = Fruit_Machine.My.Resources.Resources.Cherry
                Case "Watermelon"
                    Slot2.Image = Fruit_Machine.My.Resources.Resources.Watermelon
                Case "Skull"
                    Slot2.Image = Fruit_Machine.My.Resources.Resources.Skull
                Case "Apricot"
                    Slot2.Image = Fruit_Machine.My.Resources.Resources.Apricot
                Case "Bell"
                    Slot2.Image = Fruit_Machine.My.Resources.Resources.Bell
            End Select
            Select Case Choice3
                Case "Banana"
                    Slot3.Image = Fruit_Machine.My.Resources.Resources.Banana
                Case "Cherry"
                    Slot3.Image = Fruit_Machine.My.Resources.Resources.Cherry
                Case "Watermelon"
                    Slot3.Image = Fruit_Machine.My.Resources.Resources.Watermelon
                Case "Skull"
                    Slot3.Image = Fruit_Machine.My.Resources.Resources.Skull
                Case "Apricot"
                    Slot3.Image = Fruit_Machine.My.Resources.Resources.Apricot
                Case "Bell"
                    Slot3.Image = Fruit_Machine.My.Resources.Resources.Bell
            End Select

            x = x + 1
            Application.DoEvents()
        End While
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class

这确实有效:老虎机的每个结果都是随机的……在一定程度上。我知道代码过于复杂,但这只是一个测试项目,其他任何人都看不到。作为 VB 的新手,我知道这段代码可能......很乱。但是,当水果机的结果显示所有 3 个插槽的值相同时,就会出现主要问题。IE

这表明结果是所有 3 个头骨

我需要一个解决方案。有任何想法吗?

标签: vb.netrandom

解决方案


快速连续实例化三个Random对象会导致它们从系统时钟获得相同的种子值,因此它们都产生相同的序列。使用Random(Int32)具有不同种子的构造函数来获取三个不同的随机值序列,或者只使用一个Random对象来生成所有值。从文档(强调添加):

要生成不同的随机数序列,您可以使种子值与时间相关,从而为每个新的 Random 实例生成不同的序列。参数化的 Random(Int32) 构造函数可以根据当前时间的刻度数获取 Int32 值,而无参数的 Random() 构造函数使用系统时钟来生成其种子值。但是,由于时钟具有有限的分辨率,因此使用无参数构造函数来创建不同的 Random 对象以紧密连续地创建随机数生成器,这些生成器会生成相同的随机数序列。


推荐阅读