在vb.net中随机表现奇怪

时间:2014-03-07 19:44:16

标签: vb.net visual-studio-2012 random windows-media-player

我有一个表单应用程序,可以创建10个随机数,然后根据该数字列表播放不同的吉他弦,但每次运行它时,总会有至少3个背靠背重复的数字。应用程序写入文本文件,因此这是一个示例

 Public Class Form1
Public s As String
Dim x As New List(Of String)
Dim writer As StreamWriter = New StreamWriter("C:\Users\rmonzing\Desktop\Chords.txt")

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

    Timer1.Start()

End Sub

Private Sub Form1_Closed(sender As Object, e As EventArgs) Handles MyBase.FormClosed

    For Each item In x
        writer.Write(item.ToString)
    Next

    writer.Close()

End Sub

Public Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim range As Integer = 10

    s = "Strings Played  "
    s += vbNewLine
    Try

        For i = 0 To range
            Dim rand As New Random

            Dim z = rand.Next(1, 10)

            If z = 1 Then
                AxWindowsMediaPlayer1.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\1st_String_E_64kb.mp3"
                s += "Chord A - String E    "
            ElseIf z = 2 Then
                AxWindowsMediaPlayer2.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\2nd_String_B__64kb.mp3"
                s += "Chord A - String B   "
            ElseIf z = 3 Then
                AxWindowsMediaPlayer3.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\3rd_String_G_64kb.mp3"
                s += "Chord A - String G   "
            ElseIf z = 4 Then
                AxWindowsMediaPlayer4.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\4th_String_D_64kb.mp3"
                s += "Chord A - String D   "
            ElseIf z = 5 Then
                AxWindowsMediaPlayer5.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\5th_String_A_64kb.mp3"
                s += "Chord A - String A   "
            ElseIf z = 6 Then
                AxWindowsMediaPlayer6.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\6th_String_E_64kb.mp3"
                s += "Chord A - String E2   "
            ElseIf z = 7 Then
                AxWindowsMediaPlayer7.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\C_64kb.mp3"
                s += "Chord A - String C   "
            ElseIf z = 8 Then
                AxWindowsMediaPlayer8.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\D_64kb.mp3"
                s += "Chord A - String D Major   "
            ElseIf z = 9 Then
                AxWindowsMediaPlayer9.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\Dm_64kb.mp3"
                s += "Chord A - String D Minor  "
            ElseIf z = 10 Then
                AxWindowsMediaPlayer10.URL = "C:\Users\rmonzing\Documents\GuitarChord-A_64kb_mp3\E_64kb.mp3"
                s += "Chord A - String E Major  "
            End If
            s += vbNewLine
            z = Nothing
        Next
        CollectChords(s)

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try



End Sub

Public Sub CollectChords(ByVal s As String)

    x.Add(s)

End Sub

End Class

这是整个项目,但每次运行时,我都会得到一个像这样的文本文件

弦乐演奏了 弦A - 弦E2
弦A - 弦G
弦A - 弦B
和弦A - 弦A
弦A - 弦G
弦A - 弦G
弦A - 弦C
弦A - 弦C
弦A - 弦C
弦A - 弦E
弦A - 弦E
弦乐演奏了 和弦A - 弦D大调
弦A - 弦G
弦A - 弦E
和弦A - 弦D
和弦A - 弦D
弦A - 弦G
弦A - 弦G
弦A - 弦E2
弦A - 弦E2
弦A - 弦D小调
弦A - 弦D小调
弦乐演奏了 弦A - 弦B
弦A - 弦E
和弦A - 弦D
弦A - 弦B
弦A - 弦E2
弦A - 弦D小调
弦A - 弦D小调
弦A - 弦C
弦A - 弦C
弦A - 弦B
弦A - 弦B
弦乐演奏了 弦A - 弦D小调
弦A - 弦D小调
弦A - 弦G
弦A - 弦B
弦A - 弦B
和弦A - 弦A
和弦A - 弦D大调
和弦A - 弦D大调
弦A - 弦C
弦A - 弦C
弦A - 弦E
弦乐演奏了 弦A - 弦G
弦A - 弦E2
弦A - 弦E2
和弦A - 弦A
和弦A - 弦D大调
和弦A - 弦D大调
弦A - 弦E2
弦A - 弦E2
弦A - 弦E2
弦A - 弦E
和弦A - 弦E

我看起来不随意,不知道这里发生了什么......

1 个答案:

答案 0 :(得分:1)

将其更改为循环外的静态变量。

Static rand As New Random

Random类使用种子(只是一个整数)来生成其随机数。具有相同种子的两个随机对象将生成相同的数字。

现在,如果你没有在构造函数中提供种子,那么缺省的是种子是从Environment.TickCount中获取的。

因此,如果您快速连续创建多个Random对象,很可能许多/所有Random对象将从Environment.TickCount获取相同的种子值,因此将生成相同的数字序列。

出于这个原因,通常建议您在应用程序中只有一个Random实例(或者每个线程可能有一个实例,因为Random类不是线程安全的)。因此,您需要在循环外部移动Random对象的创建,并组织代码,以便重用相同的Random对象来生成数字。