views:

26

answers:

2

I need to generate a lot of random 2 character strings for my application. it's a VB console application. basically what I have tried for random strings is this:

  Private Function GenerateRandomString(ByVal intLenghtOfString As Integer) As String
    'Create a new StrinBuilder that would hold the random string.
    Dim randomString As New StringBuilder
    'Create a new instance of the class Random
    Dim randomNumber As Random = New Random
    'Create a variable to hold the generated charater.
    Dim appendedChar As Char
    'Create a loop that would iterate from 0 to the specified value of intLenghtOfString
    For i As Integer = 0 To intLenghtOfString
      'Generate the char and assign it to appendedChar
      appendedChar = Convert.ToChar(Convert.ToInt32(26 * randomNumber.NextDouble()) + 65)
      'Append appendedChar to randomString
      randomString.Append(appendedChar)
    Next
    'Convert randomString to String and return the result.
    Return randomString.ToString()
  End Function

AND THIS:

  Private Function RandomStringGenerator(ByVal intLen As Integer) As String

    Dim r As New Random()

    Dim i As Integer

    Dim strTemp As String = ""

    For i = 0 To intLen

      strTemp = strTemp & Chr(Int((26 * r.NextDouble()) + 65))

    Next

    Return r.Next

  End Function

But when run, it displays something like this:

SR  
SR  
SR  
SR  
SR  
SR  
SR  
SR  
SR  
SR  
BR  
BR  
BR  
BR  
BR  
BR  
BR  
KR  
KR  
KR  
KR

and so on.

What is going on? I thought that I used to, a long time ago, be able to just do random.Next.

+1  A: 

I've run into similar issues before with the Random object. The problem is that when you instantiate Random it's default seed value is the number of milliseconds since windows started up. And since you are generating random characters at several a millisecond you end up with the same seed number.

Instead you should create a shared random object instead of instantiating a new one on each call.

Patricker
Wow, Thanks! It worked!!!!
A: 

In another forum I answered a similar question and came up with this generalized function that could be used for your problem. It includes a metric that can be examined to see if there is a bias in the characters being generated.

Dim charUC As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim charLC As String = charUC.ToLower
Dim charNUM As String = "0123456789"
Dim charSPEC As String = "``!@#$%^&*()-_=+[{]}\|;:',<.>/?" & ControlChars.Quote
Dim charCounts As New Dictionary(Of Char, Integer)
Dim PRNG As New Random 'note - defined at class level

Private Function GetRandChars(ByVal numChars As Integer, _
                              Optional ByVal includeUpperCase As Boolean = False, _
                              Optional ByVal includeLowerCase As Boolean = False, _
                              Optional ByVal includeNumbers As Boolean = False, _
                              Optional ByVal includeSpecial As Boolean = False) As String

    If numChars <= 0 Then Throw New ArgumentException 'must specify valid character count

    Dim includeSel As New System.Text.StringBuilder 'contains set of characters

    If includeUpperCase Then includeSel.Append(charUC) 'UC to set
    If includeLowerCase Then includeSel.Append(charLC) 'LC to set
    If includeNumbers Then includeSel.Append(charNUM) 'numbers to set
    If includeSpecial Then includeSel.Append(charSPEC) 'specials to set

    If includeSel.Length = 0 Then Throw New ArgumentException 'must tell function at least one include

    Dim rv As New System.Text.StringBuilder 'return value
    'generate specified number of characters
    For ct As Integer = 1 To numChars
        Dim chSel As Char = includeSel(PRNG.Next(includeSel.Length)) 'select random character
        rv.Append(chSel)
        'do counts
        If charCounts.ContainsKey(chSel) Then
            charCounts(chSel) += 1
        Else
            charCounts.Add(chSel, 1)
        End If
    Next
    Return rv.ToString 'return the random string
End Function
dbasnett