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

Vb6如何生成0-9的随机字符串和x字符的a-z,vb6,random,Vb6,Random,试图创建一个随机字符串,长度为x个字符,使用0-9和a-z/a-z,似乎找不到一个好的示例,有什么想法吗?我忘记了所有的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 al

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

我忘记了所有的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! all_chars=所有有效字符的数组 种子随机数发生器 对于i=1到x do random_index=获取一个介于1和所有_字符长度之间的随机数 '我记得如何在VB6中进行讨论和评论:-) 字符串=字符串和所有字符[随机索引] 结束 完成! 因此,问题只是找出如何创建一个数组并用字符填充它,如何获得数组的长度,以及如何在所述数组的第一个和最后一个索引之间获得一个值

当然,所有这些和循环。

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

不再安装VB6

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

请注意,内置随机数生成器在编程上不安全,因此不应使用此类函数生成密码。

使用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

你没说你用这个干什么。如果需要小字符串(Joel的方法很好(整数循环变量除外,并使用“+”进行串联)。(:

但是,可以通过两种方式使输出更有趣

首先,您可以通过创建一个种子字符串,该字符串的Ee和Tt字符比Zz字符多很多,从而生成与普通英文文本具有相同近似频率分布的字符串。近似混合中可能包含1000个字符的字符串(如果大小写混合,则为该字符串的两倍)就可以了

以您希望在最终输出中看到的任何比率添加相等数量的0..9个字符。您也可以洗牌此see字符串,使其看起来更随机,但这并不重要

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

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

第二种选择是生成两个这样的种子字符串,一个辅音在语料库中的权重,另一个元音的权重相同(E大于O大于U,等等)

然后交替两个随机选择,首先从辅音,然后从元音,生成有向图,如TI,WO,DE等。将它们连接在一起形成“单词”

因为结果的输出是可发音的,所以更容易记住。另外,它看起来像是奇怪的日语。(-:


我们的库(用于VB/VBA的ASM函数)有一些例程可以做这些事情,但在纯VB中就很容易了。

受这个问题的启发,我问了一个问题,我建议在哪里使用GUID来生成序列。正如我指出的,这个问题的缺点是,如果我的逻辑中没有其他缺陷,那么它将是一个a到F和10位数字的随机序列如果缺少字母G到Z,则这可能是您的解决方案。

如果您使用SQL数据库,则可以生成如下主密钥:

选择NEWID()作为键值


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

如果cb接受32767,则“i”应该是长的,否则cb将接受32767,然后在for-loop的末尾溢出。使用“&”运算符而不是“+”进行连接。请注意,在VB6中,“1”+“2”的结果是3(!),而“1”&“2”的结果是“12”。此外,我建议使用与字符串生成器等效的字符串生成器,如此处提到的{}或仅在googleHi@Joel Spolsky中搜索vb6字符串生成器,只是一个反馈。我在excel中测试您的函数以进行100万次计算。每个生成一个包含13个字符和数字的字符串。但生成的重复键有98459个(约为10%).我认为原因可能与Rnd()有关函数,它可能不够随机,因此创建了大量重复结果。我测试了下面链接中的另一个代码,它还为13个字符和数字的字符串生成了重复记录。在100万计算中,创建了13826条重复记录。您缺少大写字母。
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