Добрый день! Я не очень опытный писатель макросов, столкнулся с проблемой, когда делал следующее: Мне нужно было заполнить одну БД рандомными именами и телефонами. Я создал такие две функции: [vba]
Код
Function Random_Name(m As Integer, sl As Integer) 'm - минимальная длина имени, sl - максимальная длина имени Dim s, a, b As String Dim i, j As Integer a = "aeiouy" b = "bcdfghjklmnpqrstvwxz" j = 0 s = s + AddChar("", j) 'Заполняем строку первым символом sl = sl - 1 Randomize For i = 1 To Int((sl - m + 1) * Rnd() + m) 'Цикл случайной длины между минимальной и максимальной длиной имени s = s + AddChar("", j)
If (InStr(1, a, Mid(s, Len(s), 1)) = 0) And (InStr(1, a, Mid(s, Len(s) - 1, 1)) = 0) Then 'если две последних согласных - добавляем гласную j = 1 Else If (InStr(1, b, Mid(s, Len(s), 1)) = 0) And (InStr(1, b, Mid(s, Len(s) - 1, 1)) = 0) Then 'если две последних гласных - добавляем согласную j = 2 Else j = 0 'если две последних разные - добавляем любую. End If End If
Next i
'Переводим первую букву в верхний регистр s2 = UCase(Left(s, 1)) s = s2 + Right(s, Len(s) - 1)
'Выводим результат Random_Name = s
End Function Function AddChar(s As String, i As Integer) 'Функция добавляет к входной строке гласную или согласную букву Dim a, b, az As String 's - входная строка az = "abcdefghijklmnopqrstuvwxyz" 'i - параметр выбора буквы где 1 - гласная, 2 - согласная, 0 - любая a = "aeiouy" b = "bcdfghjklmnpqrstvwxz" If i = 0 Then Randomize s = s + Mid(az, Int((Len(az) - 1 + 1) * Rnd + 1), 1) Else If i = 1 Then Randomize s = s + Mid(a, Int((Len(a) - 1 + 1) * Rnd + 1), 1) Else If i = 2 Then Randomize s = s + Mid(b, Int((Len(b) - 1 + 1) * Rnd + 1), 1)
Соответственно, когда мне нужно сгенерировать рандомный телефон, я в ячейку ввожу =@Random_Phone(7) и получаю телефон в формате +7 и 10 рандомных цифр. Когда мне нужно рандомное имя и фамилия, я пишу =@Random_Name(4;7) & " " &@ Random_Name(6;10) получается имя от 4 до 7 букв и фамилия от 6 до 10. Все работает, но регулярно сталкиваю с одинаковыми фамилиями, именами и даже парами "Имя+фамилия"
Иногда это мешает, потому что в системе, куда импортируется этот рандомный контент есть дедупликация и похожие строки могут отсеиваться. Может кто-нибудь подсказать, как сделать рандом более рандомным?
Добрый день! Я не очень опытный писатель макросов, столкнулся с проблемой, когда делал следующее: Мне нужно было заполнить одну БД рандомными именами и телефонами. Я создал такие две функции: [vba]
Код
Function Random_Name(m As Integer, sl As Integer) 'm - минимальная длина имени, sl - максимальная длина имени Dim s, a, b As String Dim i, j As Integer a = "aeiouy" b = "bcdfghjklmnpqrstvwxz" j = 0 s = s + AddChar("", j) 'Заполняем строку первым символом sl = sl - 1 Randomize For i = 1 To Int((sl - m + 1) * Rnd() + m) 'Цикл случайной длины между минимальной и максимальной длиной имени s = s + AddChar("", j)
If (InStr(1, a, Mid(s, Len(s), 1)) = 0) And (InStr(1, a, Mid(s, Len(s) - 1, 1)) = 0) Then 'если две последних согласных - добавляем гласную j = 1 Else If (InStr(1, b, Mid(s, Len(s), 1)) = 0) And (InStr(1, b, Mid(s, Len(s) - 1, 1)) = 0) Then 'если две последних гласных - добавляем согласную j = 2 Else j = 0 'если две последних разные - добавляем любую. End If End If
Next i
'Переводим первую букву в верхний регистр s2 = UCase(Left(s, 1)) s = s2 + Right(s, Len(s) - 1)
'Выводим результат Random_Name = s
End Function Function AddChar(s As String, i As Integer) 'Функция добавляет к входной строке гласную или согласную букву Dim a, b, az As String 's - входная строка az = "abcdefghijklmnopqrstuvwxyz" 'i - параметр выбора буквы где 1 - гласная, 2 - согласная, 0 - любая a = "aeiouy" b = "bcdfghjklmnpqrstvwxz" If i = 0 Then Randomize s = s + Mid(az, Int((Len(az) - 1 + 1) * Rnd + 1), 1) Else If i = 1 Then Randomize s = s + Mid(a, Int((Len(a) - 1 + 1) * Rnd + 1), 1) Else If i = 2 Then Randomize s = s + Mid(b, Int((Len(b) - 1 + 1) * Rnd + 1), 1)
Соответственно, когда мне нужно сгенерировать рандомный телефон, я в ячейку ввожу =@Random_Phone(7) и получаю телефон в формате +7 и 10 рандомных цифр. Когда мне нужно рандомное имя и фамилия, я пишу =@Random_Name(4;7) & " " &@ Random_Name(6;10) получается имя от 4 до 7 букв и фамилия от 6 до 10. Все работает, но регулярно сталкиваю с одинаковыми фамилиями, именами и даже парами "Имя+фамилия"
Иногда это мешает, потому что в системе, куда импортируется этот рандомный контент есть дедупликация и похожие строки могут отсеиваться. Может кто-нибудь подсказать, как сделать рандом более рандомным?Georg_IV8735