VBA получить случайным образом со строкой в ​​качестве семени - PullRequest
0 голосов
/ 20 июня 2019

Я работаю в MS-Visio 2010 в VBA (не эксперт) и хочу сгенерировать случайное число (несколько чисел было бы даже лучше) на основе строки в качестве начального числа.

Я знаючто Rnd(seed) с семенем в качестве отрицательного числа существует .Тем не менее, я не знаю ни одного случайного генератора со строкой в ​​качестве начального числа.Может быть, какая-то хеш-функция с числом в качестве результата?

Мне бы хотелось что-то вроде:

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

с поддержкой пробелов, символов и чисел внутри строки семени.

Я могу увидеть обходной путь, преобразовав каждый символ в некоторое соответствующее число ascii и каким-то образом используя это большое число в качестве начального числа с Rnd, но оно определенно кажется надуманным.Кто-нибудь знает причудливый способ сделать это?

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Объединены эти примеры

до:

    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 также доступны
  • возвращает тот же номер для тех же строк ввода
0 голосов
/ 20 июня 2019

В VBA Rnd - это функция, а не класс, и строки не могут рассматриваться как массивы.Вам нужно использовать функцию Mid для извлечения отдельных символов.

Вы можете написать функцию для возврата случайной строки.Затем эта функция может использоваться вашим обработчиком событий:

Function RandString(n As Long) As String
    'Assumes that Randomize has been invoked by caller
    Dim i As Long, j As Long, m As Long, s As String, pool As String
    pool = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    m = Len(pool)
    For i = 1 To n
        j = 1 + Int(m * Rnd())
        s = s & Mid(pool, j, 1)
    Next i
    RandString = s
    RandString = Asc(RandString)

End Function

Sub test()
    Randomize
    MsgBox RandString(50)
End Sub

Типичный вывод выглядит следующим образом:

fvdDUV1csFLhzCmrvJtYx4wXr1QGqSai6yiGSC4ByzB53kG5E1

Затем для преобразования вашей строки в число:

Asc(myString)

Таким образом, выходной результат примера будет: 102

Надеюсь, это помогло вам

ПРИМЕЧАНИЕ: Вы можете добавить в пул все символы, которые хотите (для вашегопример: "-" или "")

...