【问题标题】:Vb6 How do I make a Random String of 0-9 and a-z of x charactersVb6 如何制作 0-9 和 x 字符的 a-z 的随机字符串
【发布时间】:2008-11-15 07:02:45
【问题描述】:

尝试使用 0-9 和 a-z/A-Z 创建一个随机字符串,长度为 x 个字符,但似乎找不到一个好的示例,有什么想法吗?

【问题讨论】:

    标签: vb6 random


    【解决方案1】:
    Function RandomString(cb As Integer) As String
    
        Randomize
        Dim rgch As String
        rgch = "abcdefghijklmnopqrstuvwxyz"
        rgch = rgch & UCase(rgch) & "0123456789"
    
        Dim i As Long
        For i = 1 To cb
            RandomString = RandomString & Mid$(rgch, Int(Rnd() * Len(rgch) + 1), 1)
        Next
    
    End Function
    

    请注意,内置随机数生成器在密码学上并不安全,因此不应使用这样的函数来生成密码。

    【讨论】:

    • "i" 应该是 Long 否则 cb 将接受 32767 然后在 for 循环结束时溢出。
    • 使用“&”运算符而不是“+”连接。请注意,在 VB6 中,“1”+“2”的结果是 3(!),而“1”和“2”是“12”。另外,我建议使用等效的字符串生成器,例如这里提到的 {stackoverflow.com/questions/93932/…} 或者只是在 google 中搜索 vb6 字符串生成器
    • 嗨@Joel Spolsky,只是一个反馈。我在 excel 中测试你的函数进行 100 万次计算。每个生成一个由 13 个字符和数字组成的字符串。但是生成了 98459 个重复的密钥(大约 10%)。我认为原因可能与 Rnd() 函数有关,它可能不够随机,因此会产生大量重复的结果。
    • 我从下面的链接测试了另一个代码,它还为 13 个字符和数字的字符串生成重复记录。在 100 万次计算中,创建了 13,826 条重复记录。 stackoverflow.com/questions/22630264/…
    【解决方案2】:

    我忘记了我所有的 VB6(感谢上帝),但在伪代码中它非常简单:

    all_chars = 所有有效字符的数组 种子随机数生成器 对于 i = 1 到 x 做 random_index = 获得一个介于 1 和 all_chars 长度之间的随机数 '我记得如何在 VB6 中连接和评论 :-) 字符串 = 字符串 & all_chars[random_index] 结束 完毕!

    因此,只需找出如何创建一个数组并用字符填充它,如何获取数组的长度以及如何在所述数组的第一个和最后一个索引之间获取random number。

    嗯,当然是循环播放。

    【讨论】:

      【解决方案3】:

      Joel 的方法很好(整数循环变量除外,并且使用“+”进行连接)。 (-:

      但是,可以通过多种方式使输出变得更有趣。

      首先,您可以通过创建包含比 Zz 字符更多的 Ee 和 Tt 字符的种子字符串来生成与常见英文文本具有相同近似频率分布的字符串。 this 近似混合中可能包含 1000 个字符的字符串(如果混合大小写则为两倍)可以正常工作。

      以您希望在最终输出中看到的任何比例添加相等数量的 0..9 个字符。你也可以打乱这个 see 字符串,让它看起来更随机,但这并不重要。

      然后使用 1..Len(seedstring) 范围内的随机选择器来选择每个字符,就像在 Joel 的示例中一样。

      为什么要这样做?除了结果看起来更熟悉之外,没有什么好的理由。

      第二种选择是生成两个这样的种子串,一个是辅音在语料库中的权重,另一个是元音在相同的权重中(E 多于 O 多于 U 等)。我会只使用一种情况,而不是混合大小写。

      然后交替进行两个随机选择,首先从辅音中选择,然后从元音中选择,以生成 TI、WO、DE 等二合字母。将这些链接在一起形成“单词”。

      因为生成的输出是可发音的,所以更容易记住。另外,它看起来很日本。 (-:

      我们的Stamina 库(用于 VB/VBA 的 ASM 函数)具有执行这些操作的例程,但在纯 VB 中就足够简单了。

      【讨论】:

        【解决方案4】:

        受这个问题的启发,我询问了similar question,我建议在其中使用 GUID 生成序列。正如我指出的那样,这样做的缺点是,如果我的逻辑没有其他缺陷,那么它将是 A 到 F 和 10 位数字的随机序列。如果您可以忍受缺少字母 G 到 Z 的事实,那么这可能是您的解决方案。

        【讨论】:

          【解决方案5】:

          使用Vinko Vrsalovic的算法,这里是funcionay代码,谢谢和cya!

          all_chars = array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","S","T","U","V","W","X","Y","Z")
          Randomize
          for i = 1 to 4
             random_index = int(Rnd()*25)
          clave = clave & all_chars(random_index) 
          next
          

          【讨论】:

            【解决方案6】:

            你并没有真正说出你用这个做什么。如果您需要小字符串 (

            Public Function RandomString( _
                ByVal length As Long, _
                Optional charset As String = "abcdefghijklmnopqrstuvwxyz0123456789" _
                ) As String
                Dim chars() As Byte, value() As Byte, chrUprBnd As Long, i As Long
                If length > 0& Then
                    Randomize
                    chars = charset
                    chrUprBnd = Len(charset) - 1&
                    length = (length * 2&) - 1&
                    ReDim value(length) As Byte
                    For i = 0& To length Step 2&
                        value(i) = chars(CLng(chrUprBnd * Rnd) * 2&)
                    Next
                End If
                RandomString = value
            End Function
            

            【讨论】:

              【解决方案7】:

              如果您使用的是 SQL 数据库,您可以像这样生成 PrimaryKey:

              SELECT NEWID() as KeyValue

              这是非常好的方法,也非常安全。

              【讨论】:

                【解决方案8】:

                使用随机化
                Int(Rnd * high bound) + (low bound) 将生成一个随机数
                生成一个数组,其值从 asc("a") 到 asc("z") 以及从 asc("0") 到 asc("9")
                生成 1 到 26 (10+26) 之间的随机数并在数组中查找。

                不再安装 VB6。

                【讨论】:

                • 您缺少大写字母。
                猜你喜欢
                • 2014-11-22
                • 2019-11-22
                • 2011-03-08
                • 1970-01-01
                • 2013-12-30
                • 2020-04-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多