【问题标题】:Make array containing characters randomly taken from 3 different char arrays使包含从 3 个不同 char 数组中随机抽取的字符的数组
【发布时间】:2013-09-15 02:07:24
【问题描述】:

我在制作一个包含 8 个不同字符的数组时遇到问题,每个字符都取自 3 个不同的 char 数组之一(一个包含严格的小写字符,第二个只包含大写字符,第三个只包含数字) .

问题是,它应该一次从一个随机字符数组中获取 1 个字符。

这里声明了包含每组字符的数组:

Dim lcase() As Char = "abcdefghijklmnopqrstuvwxyz".ToCharArray()
Dim ucase() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()
Dim num() As Char = "0123456789".ToCharArray()
Dim chars(7) As Char

至于填充最终数组的代码(在我的例子中是 chars(7)):

Dim lim As Short = rand.Next(1, 5)
For x = 0 To lim
    Dim char_num As Integer = rand.Next(0, lcase.GetUpperBound(0))
    chars(x) = lcase(char_num)
Next
Dim lim2 As Short = 6 - lim
For x = 0 To lim2
    Dim char_num As Integer = rand.Next(0, num.GetUpperBound(0))
    chars(x) = num(char_num)
Next
For x = 0 To 6 - lim2
    Dim char_num As Integer = rand.Next(0, ucase.GetUpperBound(0))
    chars(x) = ucase(char_num)
Next

这可行,尽管由于某种原因它倾向于(出于某种原因)将某些值保留为空,最终导致我得到如下输出:

QHK M  D
 LCR86  

我需要让我的代码正确地填充数组,因此它包含正确的值,每个值都取自三个 char 数组。

注意:我的chars(7) 被声明为Char,因为我在其中包含的字符生成后交换它们,以从这些字符中创建一个完全随机的字符串。

我怀疑我在填充数组的代码中某处犯了错误,但如果我的错误不在上面的代码中,这里是随机化我的 chars() 数组中字符顺序的代码:

Dim j As Integer
Dim swap As Char
Dim r As Random = New Random()

For i As Integer = 0 To chars.GetUpperBound(0)
    j = r.Next(0, i)
    swap = chars(j)
    chars(j) = chars(i)
    chars(i) = swap
Next i

提前谢谢各位。

更新:我意识到我的错误,for 循环不断覆盖已经添加到数组中的内容,从而使最后几个位置保持打开状态。我现在需要的只是一种让它们正确添加到第一个空槽的方法。

【问题讨论】:

    标签: arrays vb.net string random char


    【解决方案1】:

    我想你可能有点想多了。一个直接使用 ASCII 代码查找字符的简单函数可能会更简单,更容易调试。像这样的:

    Private Function GenPass() As Char()
        Dim OutVal(7) As Char
        Dim nextchar As Char
        Dim rand As New Random(Now.Millisecond)
        For I = 0 To 7
            Do
                nextchar = Chr(rand.Next(48, 122))
    
            Loop Until Not OutVal.Contains(nextchar) AndAlso Not (nextchar > "9"c AndAlso nextchar < "A"c) AndAlso Not (nextchar > "Z"c AndAlso nextchar < "a"c)
            OutVal(I) = nextchar
        Next
        Return OutVal
    End Function
    

    输出是一个带有随机字母数字值的 Char 数组。这是一个这样的输出:

    ?GenPass
    {Length=8}
        (0): "L"c
        (1): "l"c
        (2): "W"c
        (3): "8"c
        (4): "P"c
        (5): "E"c
        (6): "c"c
        (7): "2"c
    

    【讨论】:

    • 我明白了,这看起来确实不像我的代码那么复杂,尽管这是否确保每种类型的字符至少包含 1 个?我的意思是,它总是至少有 1 个数字、1 个大写字母和 1 个小写字母吗?另外,c 在字符末尾做了什么?最后,我在这里可能错了,但... Not OutVal.Contains(nextchar) 是否确保 char 尚未包含在 OutVal 数组中?如果是这样,那是不必要的:)
    • 它不会确定字符的分布,因为它是随机的。使用 3 个布尔值并设置适当的一个 true 将允许您拒绝任何未将所有 3 个设置为 true 的输出,然后重做它。文字单个字符串末尾的c 是表示字符的vb 方式。是的,它确实确保没有字符重复,但可以删除而不影响函数的操作。
    • 非常正确 :) 虽然我只是想出了如何使用我发布的方法来做到这一点,但我意识到我一直让它覆盖第一个字符,而不是继续前一个循环停止的数组。 .
    【解决方案2】:

    最终自己找到了解决方案,我的初始代码一直覆盖第一个值,而不是继续上一个循环停止的数组。

    这是实际工作的代码:

    Dim lcase() As Char = "abcdefghijklmnopqrstuvwxyz".ToCharArray()
    Dim ucase() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()
    Dim num() As Char = "0123456789".ToCharArray()
    Dim chars(7) As Char
    
    Dim lim As Short = rand.Next(1, 6)
    
    For x = 0 To 7
        Dim char_num As Integer = rand.Next(0, lcase.GetUpperBound(0))
        chars(x) = lcase(char_num)
    Next
    
    For x = 0 To lim
        Dim char_num As Integer = rand.Next(0, num.GetUpperBound(0))
        chars(x) = num(char_num)
    Next
    
    lim = rand.Next(1, 5)
    
    For x = 0 To lim
        Dim char_num As Integer = rand.Next(0, ucase.GetUpperBound(0))
        chars(x) = ucase(char_num)
    Next
    

    【讨论】:

    • 我还是不喜欢这样:我敢打赌你在结果中看不到很多小写字符。
    • 变化很大,我从这段代码中得到的最新的是:FRusEcLnJj 和 HlNk5RCJ,所以我没有抱怨 :) (第一个是使用不同的设置,它只包括 ucase 和 lcase字符。
    【解决方案3】:

    为什么是 3 个独立的数组?为什么不是一个包含您的“字母表”的大字母,如下所示:

    Dim alphabet() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray()
    

    我现在可以听到你说,“但我怎么知道它是从每个字符集中挑选出来的?”。部分答案是它不是真正的随机,除非存在从数组中选择零次的机会。另一部分是,如果您真的需要,您可以随时验证输出并重新滚动。

    这为您提供了更简单的代码:

    Dim alphabet() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray()
    For x As Integer to chars.Length - 1
       chars(x) = rand.Next(0, alphabet.Length)
    Next
    Return New String(chars)
    

    就是这样。这就是全部。也无需重新排列这些结果。

    另一个不错的功能是它可以轻松调整您的字母表。例如,在将这些代码传达给最终用户时,drop certain characters from the alphabet 通常很有用,可以避免混淆。为此,现在您只需要更改一个字符串:

    Dim alphabet() As Char = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz123456789".ToCharArray()
    

    如果您仔细查看,您会发现缺少三个字符:大写“O”、小写“L”和数字“0”。通过省略这些字符并确保选择一种能够正确区分其他字符的字体(Courier New 可以使用,但大多数可变宽度字体需要删除更多字符),您可以避免大量呼叫帮助台。

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多