Vb.net 当调用3次时,该函数似乎不会改变值
我正在用visualbasic编写代码。该程序的目标是获得一个函数,以便在调用时从数组中随机选取字符串。问题是当按钮调用它时,它没有选择不同的值。我不知道它为什么这样做。 还有人知道如何让多行打印在标签或文本中吗?这是我的密码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
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()