生成随机字符串

8

我知道有很多这样的帖子,但是我刚开始学习vb.net,而且我不能编辑给出的源代码以创建我真正想要的内容, 所以我想要一个函数来生成随机字符串,每个字符串将包含15到32个字符,并且每个字符串都将包含以下字符(不是所有字符都在同一个字符串中,但其中一些字符): A-Z a-z 0-9 这是我的代码:

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
9个回答

23

将字符串更改为包含a-z字符:

Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

将循环改为创建随机数量的字符:

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

请注意Next方法中的上限是不包含在内的,因此Next(15, 33)会返回一个范围从15到32的值。

使用字符串的长度来选择其中的一个字符:

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

由于您需要创建多个随机字符串,而不是单个随机字符串,因此您不应该在函数内部创建随机数生成器。如果您在时间上太接近地连续调用该函数两次,您将得到相同的随机字符串,因为随机生成器是使用系统时钟作为种子。因此,您应该将随机生成器传入函数中:

Function RandomString(r As Random)

总的来说:

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

用法示例:

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

3

试试这样做:

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

您还可以查看这篇文章

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

guid不会使用字母G-Z。 - user1937198
一行代码 Guid.NewGuid.ToString() 非常有用! - Kristen Waite

2

根据您的函数作为指南,我进行了修改:

  1. 随机化长度(在minChar和maxCharacters之间)
  2. 每次随机生成不同的字符串(使用静态随机数)

代码:

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

2

试一下这个:

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

0

请注意

r.Next(0, 35)

程序经常卡住并显示相同的结果,不确定原因;最好使用

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

在这里查看VB.NET中的随机整数


如果您的“Next”方法“挂起”,那么您可能在时间上创建了太多接近的新随机生成器。不要像那样使用“Math.Ceiling”。请参阅您链接到的答案的评论。 - Guffa

0
你需要将代码行 For i As Integer = 1 To 8 改为 For i As Integer = 1 To ?,其中 ? 是字符串应该有的字符数。这会改变下面代码重复执行的次数,从而向字符串附加更多的字符。
    Dim idx As Integer = r.Next(0, 35)
    sb.Append(s.Substring(idx, 1))

0

我的意见

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

0

我根据Nathan Koop的函数进行了改进以满足自己的需求,并想与大家分享。

我添加了以下内容:

  • 能够在随机字符串中添加前缀和后缀文本
  • 能够选择允许字符(字母)的大小写形式
  • 能够选择是否包含/排除数字作为允许字符

注意:如果严格要求生成的字符串长度与添加的前缀/后缀文本长度相等,则需要处理;我没有包含任何处理逻辑。

示例用法:

' 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

0
试试这个函数,它每次都会创建一个随机字符串。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接