如何用VB6生成一个包含0-9和a-z的随机字符串,长度为x个字符?

11

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

8个回答

28
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 循环结束时溢出。 - Oorang
1
使用"&"运算符连接字符串,而不是"+". 请注意,在VB6中,“1”+“2”的结果是3(!),而“1”&“2”的结果是“12”。此外,我建议使用一个等效的字符串构建器,比如这里提到的{https://dev59.com/EHVD5IYBdhLWcg3wGHeu}或者在谷歌上搜索vb6字符串构建器。 - Ron Klein
嗨@Joel Spolsky,我想给你一些反馈。我在Excel中测试了您的函数进行了100万次计算。每次计算都会生成一个包含13个字符和数字的字符串。但是有98459个重复的键被生成(大约占10%)。我认为原因可能与Rnd()函数有关,它可能不够随机,因此会产生相当多的重复结果。 - Harry Duong
我从下面的链接中测试了另一段代码,它也会为13个字符和数字的字符串生成重复记录。在100万次计算中,共创建了13,826个重复记录。链接如下:https://dev59.com/8H3aa4cB1Zd3GeqPkft3 - Harry Duong

1

Joel的方法很好(除了整数循环变量和使用“+”连接字符串之外)。(-:

然而,输出可以通过几种方式变得更有趣。

首先,您可以生成具有与常见英语文本相同近似频率分布的字符串,方法是创建一个种子字符串,其中Ee和Tt字符比Zz字符多得多。 在this近似混合的情况下,1000个字符的字符串(如果大小写混合则加倍)将正常工作。

在任何您想在最终输出中看到的比例中添加相等数量的0..9字符。 您还可以洗牌此种子字符串以使其看起来更随机,但实际上并不重要。

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

为什么要这样做? 没有充分的理由,只是结果看起来更熟悉而已。

第二个选项是生成两个这样的种子字符串,一个是按语料库权重排序的辅音,另一个是按相同权重排列的元音(比如E比O多比U多)。 我将只使用一个案例,而不是大小写混合。

然后从辅音和元音中随机选择两个,交替生成像TI、WO、DE等二连字。将它们链接在一起形成“单词”。

由于生成的输出是可发音的,因此更容易记忆。而且,它看起来很像日语。 (-:

我们的Stamina库(VB/VBA的ASM函数)有执行这些操作的例程,但在纯VB中也很容易实现。


1
受到这个问题的启发,我提出了一个类似的问题,在其中建议使用GUID生成序列。正如我所指出的那样,这种方法的缺点是,如果我的逻辑没有其他缺陷,那么它将是A到F和10个数字的随机序列。如果你可以接受字母G到Z缺失的事实,那么这可能是一个解决方案。

1

我已经忘记了所有VB6(感谢上帝),但在伪代码中它非常容易:

    all_chars = 包含所有有效字符的数组
    种子随机数生成器
    for i = 1 to x do
        random_index = 获取一个介于1和all_chars长度之间的随机数
        '我记得如何在VB6中连接和注释 :-)
        string = string & all_chars[random_index] 
    end for

    完成!

所以问题只是找出如何创建一个数组并用字符填充它,如何获取数组的长度以及如何在该数组的第一个和最后一个索引之间获取随机数

当然,还有循环。


0
如果您正在使用SQL数据库,可以像这样生成PrimaryKey:
SELECT NEWID() as KeyValue 这是非常好的方法,也非常安全。

0

你没有真正说你用这个做什么。如果你需要短字符串(<=32,766),我认为Joel的函数就可以了。然而,如果你需要生成非常大的字符串,这可能会有用。在我的系统上,它可以在0.33291015625秒内生成一个1,000,000字符的字符串(是的,我知道...很过分:))。此外,你还可以参数化字符集,这样你就不必每次想做一些“特殊”的事情时都要改变代码:):

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

0

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

我不再安装VB6了。


你漏掉了大写字母。 - Nosredna

0
使用Vinko Vrsalovic的算法,这是功能代码,谢谢,再见!
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

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