Vb.net 当调用3次时,该函数似乎不会改变值

Vb.net 当调用3次时,该函数似乎不会改变值,vb.net,function,Vb.net,Function,我正在用visualbasic编写代码。该程序的目标是获得一个函数,以便在调用时从数组中随机选取字符串。问题是当按钮调用它时,它没有选择不同的值。我不知道它为什么这样做。 还有人知道如何让多行打印在标签或文本中吗?这是我的密码 Public Class lbl Public Function Noun() As String Dim rand As New Random Dim index As Integer Dim nouns() As String = {"boy

我正在用visualbasic编写代码。该程序的目标是获得一个函数,以便在调用时从数组中随机选取字符串。问题是当按钮调用它时,它没有选择不同的值。我不知道它为什么这样做。 还有人知道如何让多行打印在标签或文本中吗?这是我的密码

Public Class lbl

Public Function Noun() As String
    Dim rand As New Random
    Dim index As Integer
    Dim nouns() As String = {"boy", "girl", "dog", "town", "car"}
    Dim sentence As String ' used to build a sentence

    index = rand.Next(5)
    sentence = nouns(index)
    Return sentence
End Function

Public Function outs(ByVal n1 As String) As String
    Dim result = n1
    Return result
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    lblRandom.Text = outs(Noun()) & outs(Noun())

    lblRandom1.Text = outs(Noun())

End Sub

问题是,每次调用Noun()函数时,都会重新创建一个新的随机生成器。随机数生成器应该是全局变量。

问题在于.NET随机数生成器基于种子生成随机数。种子是基于当前系统日期和时间的整数。如果快速连续多次调用随机数生成器,则可能会使用相同的种子并生成相同的“随机”数。解决方案是在您希望生成随机数的过程之外声明随机对象,并将种子传递给其构造函数,该构造函数是从当前(随机)日期和时间构建的

Public Shared Function RandomNumber(ByVal lowerBound As Integer, ByVal upperBound As Integer) As Integer
    Return CInt(Math.Floor((upperBound - lowerBound + 1) * Rnd())) + lowerBound
End Function

Public Function Noun() As String
    Dim rand As New Random
    Dim index As Integer = -1
    Dim nouns() As String = {"boy", "girl", "dog", "town", "car"}
    Dim sentence As String ' used to build a sentence
    index = RandomNumber(0, 4)
    sentence = nouns(index)
    Return sentence
End Function

Public Function outs(ByVal n1 As String) As String
    Dim result = n1
    Return result
End Function

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

    lblRandom.Text = outs(Noun()) & outs(Noun())

    lblRandom1.Text = outs(Noun())

End Sub
回答你的其他问题。如果文本包含回车符,标签控件将自动换行文本。我在下面添加了lblRandom的回车

若要在文本框中换行文本,请将其“多行”属性设置为True

@Aly El-Haddad发布的代码也可以使用,但它包含一些VB6遗留代码。我已经尽可能地保持它为.NET。我还消除了多余的“outs”过程,并使其具有灵活性,以便您可以在“nowns”数组中添加或删除元素。请注意,在“index=rand.Next(5)”行中,包含了数组中不存在的元素5。基于零的数组的上限为4,因此当随机数生成器返回5时,将抛出“索引超出数组边界”错误

 Private myRandom As New Random(CType(DateTime.Now.Ticks Mod Int32.MaxValue, Integer))

 Private Function Noun() As String
     Dim index As Integer
     Dim nouns() As String = {"boy", "girl", "dog", "town", "car"}
     index = myRandom.Next(nouns.GetLowerBound(0), nouns.GetUpperBound(0))
     Return nouns(index)
 End Function

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
     lblRandom.Text = Noun() & Constants.vbNewLine & Noun()
     lblRandom1.Text = Noun()
End Sub

在这种情况下,无需为种子指定值。默认情况下,Random类的无参数构造函数将使用DateTime.Now.Ticks。你说得很对。关键是只为随机对象种子设定一次。无论是默认种子还是用户启动的种子都是无关的。因此,行:Private myRandom As New Random(CType(DateTime.Now.Ticks Mod Int32.MaxValue,Integer))可以替换为:Private myRandom As New Random()