我有一个表单应用程序,它创建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
弦乐D
弦乐D
弦A-弦G
弦A-弦G
弦A-弦E2
弦A-弦E2
和弦A-弦D小调
和弦A-弦D小调
弦乐
弦A-弦B
弦A-弦E
弦乐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
在我看来不是随机的,我不知道这里发生了什么..
发布于 2014-03-07 19:45:45
将其更改为循环外的静态变量。
Static rand As New Random随机类使用一个种子(这只是一个整数)来生成它的随机数。两个具有相同种子的随机对象将产生相同的数字。
现在,如果不在构造函数中提供种子,默认情况是从Environment.TickCount获取种子。
因此,如果快速地创建多个随机对象,那么许多/所有随机对象很可能从Environment.TickCount获得相同的种子值,从而生成相同的数字序列。
由于这个原因,通常建议您在应用程序中只有一个随机实例(或者每个线程可能只有一个实例,因为随机类不是线程安全的)。因此,您需要将随机对象的创建移到循环之外,并组织代码,以便重用相同的随机对象来生成数字。
https://stackoverflow.com/questions/22259277
复制相似问题