vba 以字符串为种子随机获取
vba get random with string as seed
我在 VBA 的 MS-Visio 2010 下工作(不是专家),我想生成一个基于字符串作为种子的随机数(多个数字会更好)。
我知道 Rnd(seed)
种子为负数 exists。但是,我不知道任何以字符串作为种子的随机生成器。也许是某种以数字作为结果的哈希函数?
我想要这样的东西:
print function("abc")
45
print function("xyz abc-5")
86
print function("abc")
45
在种子字符串中支持空格、符号和数字。
我可能会看到一个解决方法,将每个字符转换为相应的某个 ascii 数字,并以某种方式使用这个大数字作为 Rnd 的种子,但它确实感觉牵强。有谁知道这样做的更奇特的方法吗?
结合这些例子
- VBA hash string
至:
Function hash4(txt)
' copied from the example
Dim x As Long
Dim mask, i, j, nC, crc As Integer
Dim c As String
crc = &HFFFF
For nC = 1 To Len(txt)
j = Asc(Mid(txt, nC)) ' <<<<<<< new line of code - makes all the difference
' instead of j = Val("&H" + Mid(txt, nC, 2))
crc = crc Xor j
For j = 1 To 8
mask = 0
If crc / 2 <> Int(crc / 2) Then mask = &HA001
crc = Int(crc / 2) And &H7FFF: crc = crc Xor mask
Next j
Next nC
c = Hex$(crc)
' <<<<< new section: make sure returned string is always 4 characters long >>>>>
' pad to always have length 4:
While Len(c) < 4
c = "0" & c
Wend
Dim Hex2Dbl As Double
Hex2Dbl = CDbl("&h0" & c) ' Overflow Error if more than 2 ^ 64
If Hex2Dbl < 0 Then Hex2Dbl = Hex2Dbl + 4294967296# ' 16 ^ 8 = 4294967296
hash4 = Hex2Dbl
End Function
立即尝试(Ctrl
+ G
在 VBA 编辑器 window 中):
?hash4("Value 1")
31335
?hash4("Value 2")
31527
此函数将:
- return 不同输入字符串的数字不同
- 有时会匹配,叫做hash-collisions
- 如果它很关键,你可以使用 md5、sha-1 哈希,它们在 VBA 中的示例也可用
- return 相同输入字符串的相同数字
我在 VBA 的 MS-Visio 2010 下工作(不是专家),我想生成一个基于字符串作为种子的随机数(多个数字会更好)。
我知道 Rnd(seed)
种子为负数 exists。但是,我不知道任何以字符串作为种子的随机生成器。也许是某种以数字作为结果的哈希函数?
我想要这样的东西:
print function("abc")
45
print function("xyz abc-5")
86
print function("abc")
45
在种子字符串中支持空格、符号和数字。
我可能会看到一个解决方法,将每个字符转换为相应的某个 ascii 数字,并以某种方式使用这个大数字作为 Rnd 的种子,但它确实感觉牵强。有谁知道这样做的更奇特的方法吗?
结合这些例子
- VBA hash string
至:
Function hash4(txt)
' copied from the example
Dim x As Long
Dim mask, i, j, nC, crc As Integer
Dim c As String
crc = &HFFFF
For nC = 1 To Len(txt)
j = Asc(Mid(txt, nC)) ' <<<<<<< new line of code - makes all the difference
' instead of j = Val("&H" + Mid(txt, nC, 2))
crc = crc Xor j
For j = 1 To 8
mask = 0
If crc / 2 <> Int(crc / 2) Then mask = &HA001
crc = Int(crc / 2) And &H7FFF: crc = crc Xor mask
Next j
Next nC
c = Hex$(crc)
' <<<<< new section: make sure returned string is always 4 characters long >>>>>
' pad to always have length 4:
While Len(c) < 4
c = "0" & c
Wend
Dim Hex2Dbl As Double
Hex2Dbl = CDbl("&h0" & c) ' Overflow Error if more than 2 ^ 64
If Hex2Dbl < 0 Then Hex2Dbl = Hex2Dbl + 4294967296# ' 16 ^ 8 = 4294967296
hash4 = Hex2Dbl
End Function
立即尝试(Ctrl
+ G
在 VBA 编辑器 window 中):
?hash4("Value 1")
31335
?hash4("Value 2")
31527
此函数将:
- return 不同输入字符串的数字不同
- 有时会匹配,叫做hash-collisions
- 如果它很关键,你可以使用 md5、sha-1 哈希,它们在 VBA 中的示例也可用
- return 相同输入字符串的相同数字