【问题标题】:vba get random with string as seedvba以字符串为种子随机获取
【发布时间】:2019-11-03 01:20:00
【问题描述】:

我在 VBA 中的 MS-Visio 2010 下工作(不是专家),我想基于字符串作为种子生成一个随机数(几个数字会更好)。

我知道Rnd(seed) 的种子为负数exists。但是,我不知道任何以字符串为种子的随机生成器。也许某种带有数字作为结果的哈希函数?

我想要类似的东西:

print function("abc")
45
print function("xyz abc-5")
86
print function("abc")
45

在种子字符串中支持空格、符号和数字。

我可能会看到一种解决方法,将每个字符转换为一些对应的 ascii 数字,并以某种方式将这个大数字用作 Rnd 的种子,但它肯定感觉有些牵强。有谁知道这样做的更好的方式?

【问题讨论】:

  • 那么你想创建随机号码吗?因为正如我所见,您正试图像 hash 一样使用它,所以将输入字符串转换为某个常量值,当对于每个相同的字符串您想要获得相同的数字输出时?
  • 我这里的目标是根据一个字符串参数设置一些形状的颜色(相同的字符串-->相同的颜色)。我已经有了“随机数 --> 随机颜色”部分,我错过了“随机字符串 --> 随机数”部分。但我不太明白你的问题,哈希是随机的,不是吗?
  • 看看stackoverflow.com/questions/14717526/vba-hash-string,有一些创建哈希的例子
  • "我这里的目标是根据一个字符串参数设置一些形状的颜色(相同的字符串 --> 相同的颜色)。"我的建议是学习并喜欢 Visio ShapeSheet,尤其是 Prop.User. 字段。您可以使用这些来创建各种视觉魔术,而无需接触任何 VBA。 www.visguy.com 是学习各种让 Visio 唱歌的好方法。
  • 为了您的信息,您也可以自动(通过 VBA)设置/更改 ShapeSheets。并且在 ShapeSheet 中设置自动化的模板中使用 Masters 的好处也值得考虑。这一切都归结为计划您的图表,在您修改图表时,预先付出一点努力可以节省大量精力。

标签: vba random visio random-seed


【解决方案1】:

结合这些例子

到:

    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 编辑器窗口中):

?hash4("Value 1")
31335 
?hash4("Value 2") 
31527 

这个函数将:

  • 为不同的输入字符串返回不同的数字
    • 有时它们会匹配,这称为哈希冲突
      • 如果很关键,您可以使用 md5、sha-1 哈希,它们在 VBA 中的示例也可用
  • 为相同的输入字符串返回相同的数字

【讨论】:

  • @Yvonnig,请务必针对您的具体情况研究碰撞缺陷
  • 我刚试了一下,效果很好,非常感谢!在我的情况下,碰撞并不是一个很大的麻烦:)
猜你喜欢
  • 2011-02-18
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2014-09-13
相关资源
最近更新 更多