Search code examples
vb.netuniqueidentifierdo-loops

create 1000, 8-character random ID's, all unique and display in a text box


enter image description hereWrite a program to display 1000 8-character random user IDs in a text box after you click a button. Make sure the program verifies that none of the IDs are identical. Each userid should include a mixture of alphabetic characters and numbers.

What I have so far, which could be enough to get by as a random ID generator alone, but it does not loop 1000 times to be displayed in the label, and doesn't check for repeated ID's.

Public Class Form1
    Private Sub btnGenerateRandomID_Click(sender As Object, e As EventArgs) Handles btnGenerateRandomID.Click
        Dim rand As New Random

        Dim char1 As String
        Dim char2 As String
        Dim char3 As String
        Dim char4 As String
        Dim char5 As String
        Dim char6 As String
        Dim char7 As String
        Dim char8 As String


        char1 = ChrW(rand.Next(Asc("A"), Asc("Z") + 1))
        char2 = ChrW(rand.Next(Asc("A"), Asc("Z") + 1))
        char3 = ChrW(rand.Next(Asc("A"), Asc("Z") + 1))
        char4 = ChrW(rand.Next(Asc("A"), Asc("Z") + 1))
        char5 = rand.Next(0, 9)
        char6 = rand.Next(0, 9)
        char7 = rand.Next(0, 9)
        char8 = rand.Next(0, 9)



        lblRandomId.Text = char1 + char2 + char3 + char4 + char5 + char6 + char7 + char8

    End Sub
End Class

Thanks.

EDIT:

Public Class Form1 'Write a program to display 1000 8-character random user IDs in a text 'box after you click a button. Make sure the program verifies that none Of the IDs are identical. 'Each userid should include a mixture Of alphabetic characters And numbers.

Private Sub btnGenerateRandomID_Click(sender As Object, e As EventArgs) Handles btnGenerateRandomID.Click

    Dim strChar As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    Dim rand As New Random
    Dim strID As String = ""

    For count_ids As Integer = 0 To 999
        For count_chars As Integer = 0 To 7
            strID += strChar(rand.Next(0, 62))
        Next count_chars
        lblRandomId.Text = strID
    Next






End Sub

End Class

Here is the actual question "Q. Write a program to display 1000 8-character random user IDs in a text box after you click a button. Make sure the program verifies that none of the IDs are identical. Each userid should include a mixture of alphabetic characters and numbers.

Explain your program in your essay, with screenshots. Include a paragraph on the random number generator used in Visual Basic, and answer the question: how should the random number generator be best seeded?"


Solution

  • This function will return the ASCII characters between 48 an 122. That will include some characters that are not letters or numbers but this makes the ids even more unique and simplifies the code.

    The For loop builds the ids with a length of 8. Then the id is checked for uniqueness with the .Contains method. Only if it is not in the list, it is added to the list and the counter is incremented.

    Private Rnd As New Random
    
    Private Function GetListOfIDs() As List(Of String)
        Dim Counter As Integer
        Dim lst As New List(Of String)
        Dim id As String = ""
        Do While Counter < 1000
            id = ""
            For i = 0 To 7
                id &= Chr(Rnd.Next(48, 123))
            Next
            If Not lst.Contains(id) Then
                lst.Add(id)
                Counter += 1
            End If
        Loop
        Return lst
    End Function
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim lst = GetListOfIDs()
        TextBox1.Text = String.Join(vbCrLf, lst)
    End Sub
    

    EDIT

    As per suggestion by Caius Jard in comments I have added a solution using a HashSet. Same idea only a HashSet will not accept duplicate entries. The .Add method returns a boolean telling you if the Add was successful.

    Private Function GetListOfIDs() As HashSet(Of String)
        Dim hs As New HashSet(Of String)
        Dim id As String = ""
        Do While hs.Count < 1001
            id = ""
            For i = 0 To 7
                id &= Chr(Rnd.Next(48, 123))
            Next
            If hs.Add(id) Then
                Counter += 1
            End If
        Loop
        Return hs
    End Function
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim hs = BuildHashSet()
        TextBox1.Text = String.Join(vbCrLf, hs)
    End Sub
    

    This method is probably more efficient because a HashSet is designed for hight performance. For 1000 items I did not notice any difference in the user interface. The text box updated immediately with both methods.