【发布时间】:2008-11-15 07:02:45
【问题描述】:
尝试使用 0-9 和 a-z/A-Z 创建一个随机字符串,长度为 x 个字符,但似乎找不到一个好的示例,有什么想法吗?
【问题讨论】:
尝试使用 0-9 和 a-z/A-Z 创建一个随机字符串,长度为 x 个字符,但似乎找不到一个好的示例,有什么想法吗?
【问题讨论】:
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
请注意,内置随机数生成器在密码学上并不安全,因此不应使用这样的函数来生成密码。
【讨论】:
我忘记了我所有的 VB6(感谢上帝),但在伪代码中它非常简单:
all_chars = 所有有效字符的数组 种子随机数生成器 对于 i = 1 到 x 做 random_index = 获得一个介于 1 和 all_chars 长度之间的随机数 '我记得如何在 VB6 中连接和评论 :-) 字符串 = 字符串 & all_chars[random_index] 结束 完毕!因此,只需找出如何创建一个数组并用字符填充它,如何获取数组的长度以及如何在所述数组的第一个和最后一个索引之间获取random number。
嗯,当然是循环播放。
【讨论】:
Joel 的方法很好(整数循环变量除外,并且使用“+”进行连接)。 (-:
但是,可以通过多种方式使输出变得更有趣。
首先,您可以通过创建包含比 Zz 字符更多的 Ee 和 Tt 字符的种子字符串来生成与常见英文文本具有相同近似频率分布的字符串。 this 近似混合中可能包含 1000 个字符的字符串(如果混合大小写则为两倍)可以正常工作。
以您希望在最终输出中看到的任何比例添加相等数量的 0..9 个字符。你也可以打乱这个 see 字符串,让它看起来更随机,但这并不重要。
然后使用 1..Len(seedstring) 范围内的随机选择器来选择每个字符,就像在 Joel 的示例中一样。
为什么要这样做?除了结果看起来更熟悉之外,没有什么好的理由。
第二种选择是生成两个这样的种子串,一个是辅音在语料库中的权重,另一个是元音在相同的权重中(E 多于 O 多于 U 等)。我会只使用一种情况,而不是混合大小写。
然后交替进行两个随机选择,首先从辅音中选择,然后从元音中选择,以生成 TI、WO、DE 等二合字母。将这些链接在一起形成“单词”。
因为生成的输出是可发音的,所以更容易记住。另外,它看起来很日本。 (-:
我们的Stamina 库(用于 VB/VBA 的 ASM 函数)具有执行这些操作的例程,但在纯 VB 中就足够简单了。
【讨论】:
受这个问题的启发,我询问了similar question,我建议在其中使用 GUID 生成序列。正如我指出的那样,这样做的缺点是,如果我的逻辑没有其他缺陷,那么它将是 A 到 F 和 10 位数字的随机序列。如果您可以忍受缺少字母 G 到 Z 的事实,那么这可能是您的解决方案。
【讨论】:
使用Vinko Vrsalovic的算法,这里是funcionay代码,谢谢和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
【讨论】:
你并没有真正说出你用这个做什么。如果您需要小字符串 (
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
【讨论】:
如果您使用的是 SQL 数据库,您可以像这样生成 PrimaryKey:
SELECT NEWID() as KeyValue
这是非常好的方法,也非常安全。
【讨论】:
使用随机化
Int(Rnd * high bound) + (low bound) 将生成一个随机数
生成一个数组,其值从 asc("a") 到 asc("z") 以及从 asc("0") 到 asc("9")
生成 1 到 26 (10+26) 之间的随机数并在数组中查找。
不再安装 VB6。
【讨论】: