2015-08-21 71 views
2

我想构建一个特定长度的随机生成的字符串的静态数组。我已经基于here迄今为止的所有内容,但数组中的每个索引都具有相同的字符串,而不是不同的字符串。我究竟做错了什么?生成一个随机字符串数组

Dim Target As String 
Target = InputBox("Input target string") 

    Dim StringArray(10) As String 
     For i = 1 To 10 
      StringArray(i) = GenerateString(Len(Target)) 
      Debug.Print(StringArray(i)) 
     Next 

    Function GenerateString(size As Integer) As String 
     Dim LegalCharacters As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
     Dim Rnd As New Random() 
     Dim Builder As New System.Text.StringBuilder() 
     Dim Ch As Char 

     For i As Integer = 0 To size - 1 
      Ch = LegalCharacters(Rnd.Next(0, LegalCharacters.Length)) 
      Builder.Append(Ch) 
     Next 

     Return Builder.ToString() 
    End Function 
+0

我会避免使用'Rnd'一个变量名,因为这是产生一个随机值另一个函数,所以它可能会导致奇怪的编译错误 –

回答

1

这个:Dim Rnd As New Random()是错误发生的地方。

当您实例化新的Random()时,它将当前时间作为种子。由于您在每次迭代中再次实例化,并且所有迭代步骤都在“相同”时间(以非常快的速度)发生,因此每个Random()都会生成相同的输出。

你必须在迭代器之前初始化一次,并将它作为参数传递给函数,或者也可以将它作为类的静态属性。

TL; DR:您将不得不重复使用相同的Random(),而不是为每次迭代创建一个新的。

这应该是正确的代码:

Dim Target As String 
Target = InputBox("Input target string") 

Dim StringArray(10) As String 
    Dim Rnd As New Random() 
    For i = 1 To 10 
     StringArray(i) = GenerateString(Len(Target), Rnd) 
     Debug.Print(StringArray(i)) 
    Next 

Function GenerateString(size As Integer, Rnd as Random) As String 
    Dim LegalCharacters As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

    Dim Builder As New System.Text.StringBuilder() 
    Dim Ch As Char 

    For i As Integer = 0 To size - 1 
     Ch = LegalCharacters(Rnd.Next(0, LegalCharacters.Length)) 
     Builder.Append(Ch) 
    Next 

    Return Builder.ToString() 
End Function