我有一个表单应用程序,可以创建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
我看起来不随意,不知道这里发生了什么......
答案 0 :(得分:1)
将其更改为循环外的静态变量。
Static rand As New Random
Random类使用种子(只是一个整数)来生成其随机数。具有相同种子的两个随机对象将生成相同的数字。
现在,如果你没有在构造函数中提供种子,那么缺省的是种子是从Environment.TickCount中获取的。
因此,如果您快速连续创建多个Random对象,很可能许多/所有Random对象将从Environment.TickCount获取相同的种子值,因此将生成相同的数字序列。
出于这个原因,通常建议您在应用程序中只有一个Random实例(或者每个线程可能有一个实例,因为Random类不是线程安全的)。因此,您需要在循环外部移动Random对象的创建,并组织代码,以便重用相同的Random对象来生成数字。