首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vb.net中的随机行为奇怪

vb.net中的随机行为奇怪
EN

Stack Overflow用户
提问于 2014-03-07 19:44:15
回答 1查看 124关注 0票数 0

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

代码语言:javascript
复制
 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

在我看来不是随机的,我不知道这里发生了什么..

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-07 19:45:45

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

代码语言:javascript
复制
Static rand As New Random

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

现在,如果不在构造函数中提供种子,默认情况是从Environment.TickCount获取种子。

因此,如果快速地创建多个随机对象,那么许多/所有随机对象很可能从Environment.TickCount获得相同的种子值,从而生成相同的数字序列。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22259277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档