11

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

4

8 回答 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

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

于 2008-11-15T07:52:32.897 回答
1

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

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

    完毕!

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

好吧,当然还有循环。

于 2008-11-15T07:09:42.513 回答
1

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

于 2009-05-27T19:41:45.470 回答
1

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

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

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

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

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

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

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

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

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

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

于 2009-05-27T15:09:23.900 回答
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
于 2009-05-27T12:59:59.760 回答
0

使用 Vinko Vrsalovic 的算法,这是功能代码,谢谢和 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
于 2009-05-26T10:35:08.943 回答
0

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

不再安装 VB6。

于 2008-11-15T07:38:54.467 回答
0

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

SELECT NEWID() as KeyValue

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

于 2016-07-02T04:47:46.763 回答