kasf
kasf

Reputation: 113

generate random string

well i know that there are a lot of these threads but im new to vb.net yet i cant edit the sources given to make what i really want so i want a function that will generate random strings which will contain from 15-32 characters each and each of them will have the following chars ( not all at the same string but some of them ) : A-Z a-z 0-9 here is my code so far

Functon RandomString()
    Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    Dim r As New Random
    Dim sb As New StringBuilder
    For i As Integer = 1 To 8
        Dim idx As Integer = r.Next(0, 35)
        sb.Append(s.Substring(idx, 1))
    Next
    return sb.ToString()
End Function

Upvotes: 8

Views: 48825

Answers (9)

Rakesh Sharma
Rakesh Sharma

Reputation: 1

Try this function, it creates Random String every time.

Public Function RandomString_Gen(ByVal intLength As Integer) As String
    Dim strAllowedCharacters As String = "B6JFJVKFRFPFCR6H4QBFGUJGBQCR6JF24ARY3CJFBFYAFY3AR6JFAR6J4ME6A6J6RAY6RUEVKJFY3CB6JFJFBFYAFY3AR6AUAFY6JYY3EBY4J6443YFY36J6AUAFY6JYY3R6JYFPJQGR6JFUE6JF3C6JFAJEJVKFRFPF3GY4CPJFYFYFYAFY3AR6JFAR6JCFYY3CBAPR6JUEVKJFY3CB6JFJFBFYAFY3AR6JFAR6J4ME6A6J6RAY6R6443YFY36J6AUAFY6JYY3EBY4JFY3CBAPR6JUEVKJFY3CB6JFJFBFYAFY3AR6JFAR6J4ME6BFYAFY36JFUEFGUJGBQECY3RU3GY4CPJFY6J6RAY6FY6JYY3EBY4JFY3CBAPR6JUEVKJFY3CUEVKJFY3CB6JFJFJVKFRFPFCR6H4QBFGUJGBQCR6JF24ARY3CBFYAFY3AR6AUAFY6JYY3E6RAY6RUEVKJFY3CB6JFJFBFYAFY3AR6AUAFY6JYY3EBY4J6443YFY36J6AUAFY6JYY3R6JYFPJQGR6JFUE6JF3C6BY4JB6JFJFBF6443YFY36J6AUAFY6JYY3R6JYFFY3CB6JFJFBFYAFY3AR6JFAR6J4ME6A6J6RAY6R6443YFY36J6AUAFY6JYY3EBY4JFY3CBAPR6JUEVKJFY3CB6JFJFBFYAFY3AR6JFAR6J4ME6BFYAFY36JFUEFGUJGBQECY3RU3GY4PJF4PAAAJFRJVKFRFPFCR6H4QBFGUJGBQCR6JF24ARY3CB6QGY4FYQPYY36PJJ6CBAQGY6FUJ6CBRPR6JFAR3CB6QGRCBAPR6JUEVKJFY3CB6JFJFBFYY36J6AUAFY6JYY3R6JYFPJF4PAAAJFRJAFY3AR6JFAR6J4ME6A6J6RAY6R6443YFY36J6ME6A6J6RAY6R6443YFY36J6AUAFYB6JFJFBFYAFY3AR6JFAR6J4ME6A6J6RAY6R6443YFY36J6AUAFY6JYY3R6JYFPJQGR6JFUE6JF3C6JFAJEJVKFRFPF3GY4CP6JYY3EBY4JFY3CBAPR6JUEVKJFY3CB6JFJFBFYAFY3AR6AUAFY6JYY3EBY4JFY3CBAPR6JUEVKJFY3CB6JVKFRFPFCR6H4QBFGUJGBQCR6JF24ARY3CJFJFBFYAFY36JFUEFGUJGBQECY3RU3GY4CPJFYFYCFY3EBY4JFY3CBE6A6J6RAY6R6443YFY36J6AUAFY6JYY3R6JYFPJF4PAAAJFRJVKFRFPFCR6H4QBFGUAPR6JUEVKY3R6JYFPJF4PAAAJFR6PJJ6CBAQGY6FUJ6CBRPJVKFRFPFCR6H4QBFGUJGBQCR6JF24ARY3CR6JFAR3CB6PR6JUEVKJFY3CB6JFJFBFYAFY3AR6JFAR6J4ME6A6J6RAY6R6443YFY36J6AUAFY6JYY3RY36J6AUAFY6JYY3R6JYFPJF4PAAAJFRJJYFPJQGR6JFUE6JF3C6JFAJEJVKFRFPF3GY4CP"

    Dim rndm As New Random
    Dim StartInt As Integer = rndm.Next(1, 176)
    Dim LengthInt As Integer = rndm.Next(200, 576)

    strAllowedCharacters = strAllowedCharacters.Substring(StartInt, LengthInt)

    Dim chrChars() As Char = strAllowedCharacters.ToCharArray
    Dim strReturn As New StringBuilder()
    Do Until Len(strReturn.ToString) = intLength
        Dim x As Integer = Rnd() * (chrChars.Length - 1)
        strReturn.Append(chrChars(CInt(x)))
    Loop
    Return strReturn.ToString
End Function

Upvotes: 0

J. Scott Elblein
J. Scott Elblein

Reputation: 4253

I beefed up Nathan Koop's function for my own needs, and thought I'd share.

I added:

  • Ability to add Prepended and Appended text to the random string
  • Ability to choose the casing of the allowed characters (letters)
  • Ability to choose to include/exclude numbers to the allowed characters

NOTE: If strictly looking for an exact length string while also adding pre/appended strings you'll need to deal with that; I left out any logic to handle that.

Example Usages:

' Straight call for a random string of 20 characters
' All Caps + Numbers
String_Random(20, 20, String.Empty, String.Empty, 1, True)

' Call for a 30 char string with prepended string
' Lowercase, no numbers
String_Random(30, 30, "Hey_Now_", String.Empty, 2, False)

' Call for a 15 char string with appended string
' Case insensitive + Numbers
String_Random(15, 15, String.Empty, "_howdy", 3, True)

.

Public Function String_Random(
    intMinLength As Integer,
    intMaxLength As Integer,
    strPrepend As String,
    strAppend As String,
    intCase As Integer,
    bIncludeDigits As Boolean) As String

    ' Allowed characters variable
    Dim s As String = String.Empty

    ' Set the variable to user's choice of allowed characters
    Select Case intCase

        Case 1

            ' Uppercase
            s  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

        Case 2

            ' Lowercase
            s = "abcdefghijklmnopqrstuvwxyz"                

        Case Else

            ' Case Insensitive + Numbers
            s  = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 

    End Select

    ' Add numbers to the allowed characters if user chose so
    If bIncludeDigits = True Then s &= "0123456789"

    Static r As New Random

    Dim chactersInString As Integer = r.Next(intMinLength, intMaxLength)
    Dim sb As New StringBuilder

    ' Add the prepend string if one was passed
    If String.IsNullOrEmpty(strPrepend) = False Then sb.Append(strPrepend)

    For i As Integer = 1 To chactersInString

        Dim idx As Integer = r.Next(0, s.Length)

        sb.Append(s.Substring(idx, 1))

    Next

    ' Add the append string if one was passed
    If String.IsNullOrEmpty(strAppend) = False Then sb.Append(strAppend)

    Return sb.ToString()

End Function

Upvotes: 0

HighTechProgramming15
HighTechProgramming15

Reputation: 343

Try this out:

Private Function RandomString(ByRef Length As String) As String
    Dim str As String = Nothing
    Dim rnd As New Random
    For i As Integer = 0 To Length
        Dim chrInt As Integer = 0
        Do
            chrInt = rnd.Next(30, 122)
            If (chrInt >= 48 And chrInt <= 57) Or (chrInt >= 65 And chrInt <= 90) Or (chrInt >= 97 And chrInt <= 122) Then
                Exit Do
            End If
        Loop
        str &= Chr(chrInt)
    Next
    Return str
End Function

Upvotes: 2

Guffa
Guffa

Reputation: 700162

Change the string to include the a-z characters:

Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

Change the loop to create a random number of characters:

Dim cnt As Integer = r.Next(15, 33)
For i As Integer = 1 To cnt

Note that the upper boundary in the Next method is exclusive, so Next(15, 33) gives you a value that can range from 15 to 32.

Use the length of the string to pick a character from it:

Dim idx As Integer = r.Next(0, s.Length)

As you are going to create random strings, and not a single random string, you should not create the random number generator inside the function. If you call the function twice too close in time, you would end up with the same random string, as the random generator is seeded using the system clock. So, you should send the random generator in to the function:

Function RandomString(r As Random)

So, all in all:

Function RandomString(r As Random)
  Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  Dim sb As New StringBuilder
  Dim cnt As Integer = r.Next(15, 33)
  For i As Integer = 1 To cnt
    Dim idx As Integer = r.Next(0, s.Length)
    sb.Append(s.Substring(idx, 1))
  Next
  return sb.ToString()
End Function

Usage example:

Dim r As New Random
Dim strings As New List<string>()
For i As Integer = 1 To 10
  strings.Add(RandomString(r))
Next

Upvotes: 23

Adil Al-Hilali
Adil Al-Hilali

Reputation: 41

please note that the

r.Next(0, 35)

tend to hang and show the same result Not sure whay; better to use

CInt(Math.Ceiling(Rnd() * N)) + 1

see it here Random integer in VB.NET

Upvotes: 0

dbasnett
dbasnett

Reputation: 11773

My $.02

Dim prng As New Random
Const minCH As Integer = 15 'minimum chars in random string
Const maxCH As Integer = 35 'maximum chars in random string

'valid chars in random string
Const randCH As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

Private Function RandomString() As String
    Dim sb As New System.Text.StringBuilder
    For i As Integer = 1 To prng.Next(minCH, maxCH + 1)
        sb.Append(randCH.Substring(prng.Next(0, randCH.Length), 1))
    Next
    Return sb.ToString()
End Function

Upvotes: 0

Nathan Koop
Nathan Koop

Reputation: 25197

Using your function as a guide, I modified it to:

  1. Randomize the length (between minChar & maxCharacters)
  2. Randomize the string produced each time (by using the static Random)

Code:

Function RandomString(minCharacters As Integer, maxCharacters As Integer)
    Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    Static r As New Random
    Dim chactersInString As Integer = r.Next(minCharacters, maxCharacters)
    Dim sb As New StringBuilder
    For i As Integer = 1 To chactersInString
        Dim idx As Integer = r.Next(0, s.Length)
        sb.Append(s.Substring(idx, 1))
    Next
    Return sb.ToString()
End Function

Upvotes: 2

Rahul Tripathi
Rahul Tripathi

Reputation: 172378

Try something like this:-

stringToReturn&= Guid.NewGuid.ToString().replace("-","")

You can also check this:-

Sub Main()
        Dim KeyGen As RandomKeyGenerator
        Dim NumKeys As Integer
        Dim i_Keys As Integer
        Dim RandomKey As String

        ''' MODIFY THIS TO GET MORE KEYS    - LAITH - 27/07/2005 22:48:30 -
        NumKeys = 20

        KeyGen = New RandomKeyGenerator
        KeyGen.KeyLetters = "abcdefghijklmnopqrstuvwxyz"
        KeyGen.KeyNumbers = "0123456789"
        KeyGen.KeyChars = 12
        For i_Keys = 1 To NumKeys
            RandomKey = KeyGen.Generate()
            Console.WriteLine(RandomKey)
        Next
        Console.WriteLine("Press any key to exit...")
        Console.Read()
    End Sub

Upvotes: 3

user1937198
user1937198

Reputation: 5348

You need to change the line For i As Integer = 1 To 8 to For i As Integer = 1 To ? where ? is the number of characters long the string should be. This changes the number of times it repeats the code below so more characters are appended to the string.

    Dim idx As Integer = r.Next(0, 35)
    sb.Append(s.Substring(idx, 1))

Upvotes: 0

Related Questions