试图创建一个长度为x的随机字符串,使用0-9和a-z / A-Z,但似乎找不到一个好的示例,有什么建议吗?
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
请注意,内置的随机数生成器不是加密安全的,因此不应使用像这样的函数来生成密码。
Joel的方法很好(除了整数循环变量和使用“+”连接字符串之外)。(-:
然而,输出可以通过几种方式变得更有趣。
首先,您可以生成具有与常见英语文本相同近似频率分布的字符串,方法是创建一个种子字符串,其中Ee和Tt字符比Zz字符多得多。 在this近似混合的情况下,1000个字符的字符串(如果大小写混合则加倍)将正常工作。
在任何您想在最终输出中看到的比例中添加相等数量的0..9字符。 您还可以洗牌此种子字符串以使其看起来更随机,但实际上并不重要。
然后使用范围为1..Len(seedstring)的随机选择器选择每个字符,就像在Joel的示例中一样。
为什么要这样做? 没有充分的理由,只是结果看起来更熟悉而已。
第二个选项是生成两个这样的种子字符串,一个是按语料库权重排序的辅音,另一个是按相同权重排列的元音(比如E比O多比U多)。 我将只使用一个案例,而不是大小写混合。
然后从辅音和元音中随机选择两个,交替生成像TI、WO、DE等二连字。将它们链接在一起形成“单词”。
由于生成的输出是可发音的,因此更容易记忆。而且,它看起来很像日语。 (-:
我们的Stamina库(VB/VBA的ASM函数)有执行这些操作的例程,但在纯VB中也很容易实现。
我已经忘记了所有VB6(感谢上帝),但在伪代码中它非常容易:
all_chars = 包含所有有效字符的数组 种子随机数生成器 for i = 1 to x do random_index = 获取一个介于1和all_chars长度之间的随机数 '我记得如何在VB6中连接和注释 :-) string = string & all_chars[random_index] end for 完成!
所以问题只是找出如何创建一个数组并用字符填充它,如何获取数组的长度以及如何在该数组的第一个和最后一个索引之间获取随机数。
当然,还有循环。
你没有真正说你用这个做什么。如果你需要短字符串(<=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
使用Randomize
Int(Rnd * high bound) + (low bound) 可以生成随机数
生成一个包含从asc("a")到asc("z")和从asc("0")到asc("9")的值的数组
生成1到26(10+26)之间的随机数,并在数组中查找它。
我不再安装VB6了。
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