Vb6如何制作0-9和a-z的x字符的随机字符串

问题描述 投票:11回答:8

尝试使用0-9和a-z / A-Z创建一个随机字符串,长度为x的字符,似乎无法找到一个好例子,任何想法?

vb6 random
8个回答
27
投票
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

请注意,内置随机数生成器不具有cryprograph安全性,因此不应使用此类函数生成密码。


1
投票

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

    all_chars = an array of all the valid chars
    seed random number generator
    for i = 1 to x do
        random_index = get a random number between 1 and length of all_chars
        'I remember how to concat and comment in VB6 :-)
        string = string & all_chars[random_index] 
    end for

    done!

所以这只是找到如何创建一个数组并用字符填充它,如何获得数组的长度以及如何在所述数组的第一个和最后一个索引之间获得random number的问题。

好吧,所有这一切和循环当然。


1
投票

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

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

首先,您可以通过创建具有比Zz字符多得多的Ee和Tt字符的种子字符串,生成与普通英文文本具有相同近似频率分布的字符串。在this近似混合中,可能有1000个字符的字符串(如果是混合的情况,则为双倍)可以正常工作。

添加相同数量的0..9个字符,无论您希望在最终输出中看到什么比例。你也可以改变这个看到的字符串,使它看起来更随机,但它并不重要。

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

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

第二种选择是产生两个这样的种子串,一个是语料库权重的辅音,另一个是元音具有相同的权重(E比O大于U等)。我只会使用一个案例,而不是混合案例。

然后交替两个随机选择,首先来自辅音,然后来自元音,以生成诸如TI,WO,DE等的有向图。将这些链接在一起形成“单词”。

由于结果输出是可读的,因此更容易记住。此外,它看起来很奇怪日本人。 ( - :

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


1
投票

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


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

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
投票

如果您使用的是SQL数据库,则可以生成如下的PrimaryKey:

SELECT NEWID() as KeyValue

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


0
投票

使用随机化 Int(Rnd *上限)+(下限)将生成一个随机数 生成一个数组,其值从asc(“a”)到asc(“z”),从asc(“0”)到asc(“9”) 生成1到26之间的随机数(10 + 26)并在数组中查找。

不再安装VB6了。

© www.soinside.com 2019 - 2024. All rights reserved.