-1

嗨,请检查此代码

For icnt As Integer = 1 To 100
        Me.SetText(icnt)
        Dim gd As String = ""
        Dim gl As String = ""
        Dim cr As String = ""
        Dim lr As String = ""
        Dim tbs As String = ""
        Dim srt As String = ""
        Dim fp As String = ""
        Dim ky As String = ""
        Dim prx As String = ""

        Dim rnd As New Random
        Dim scrpurl As String = ""
        Dim bldstr As New List(Of String)

        scrpurl = GlobalVariables.domain(rnd.Next(0, GlobalVariables.googledomain.Count - 1)) & "/search?q="
        scrpurl = scrpurl & GlobalVariables.prints(rnd.Next(0, GlobalVariables.footprints.Count - 1))
        scrpurl = scrpurl & GlobalVariables.words(rnd.Next(0, GlobalVariables.keywords.Count - 1))
        scrpurl = scrpurl & GlobalVariables.gl(rnd.Next(0, GlobalVariables.googlegl.Count - 1))
        scrpurl = scrpurl & GlobalVariables.cr(rnd.Next(0, GlobalVariables.googlecr.Count - 1))
        scrpurl = scrpurl & GlobalVariables.lr(rnd.Next(0, GlobalVariables.googlelr.Count - 1))
        scrpurl = scrpurl & GlobalVariables.tbs(rnd.Next(0, GlobalVariables.googletbs.Count - 1))
        scrpurl = scrpurl & GlobalVariables.start(rnd.Next(0, GlobalVariables.googlestart.Count - 1))

        MsgBox(scrpurl)

        bldstr.Clear()
        bldstr.Add(scrpurl)

        Dim dr3 As DataRow() = dtse.Select("seurl ='" & scrpurl & "'", "se")
        If (dr3.Count = 0) Then
            Dim w1 As WaitCallback = New WaitCallback(AddressOf setdata)
            ThreadPool.QueueUserWorkItem(w1, bldstr)
        End If

    Next

谁能告诉我,当我显示消息框时,我看到 scrpurl 和 setdata 的不同值添加了正确的 100 个唯一行。

当我不显示它时,setdata 会添加 100 行相同的 scrpurl。我知道应该做一些事情,以便每个 setdata 获得不同的 scrpurl,但我在这里遗漏了一些东西。谁能帮帮我?

问候,

4

1 回答 1

1

Random每次迭代循环时,您都在创建一个新对象。如果将Dim rnd As New Random行向上移动到 for 循环之前,它将正常工作。

这是因为计算机生成的随机数并不是真正随机的——它们只是看起来是随机的。它的工作方式是首先确定一个“种子”值。然后,它使用一个数学公式,输入种子值加上一个附加序列值,就可以得到下一个(看似)随机数。因此,只要种子值相同,它生成的随机数序列将始终相同。Random类生成它的种子值的方式是基于创建对象的当前时间。因此,如果您同时创建一堆Random对象,它们都会生成完全相同的随机数序列。

因此,最佳实践通常是Random在应用程序启动时创建一个对象,然后在任何地方重复使用同一个对象,而不是每次需要时都创建一个新对象。

于 2013-01-09T11:17:14.687 回答