Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Плохо рандомизирует рандом - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Плохо рандомизирует рандом (Макросы/Sub)
Плохо рандомизирует рандом
Georg_IV8735 Дата: Четверг, 15.12.2022, 23:06 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Добрый день!
Я не очень опытный писатель макросов, столкнулся с проблемой, когда делал следующее:
Мне нужно было заполнить одну БД рандомными именами и телефонами.
Я создал такие две функции:
[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)

End If
End If
End If
AddChar = s
End Function

Function Random_Phone(pr As String)
Dim s As String
Randomize
s = "+" & pr & " " & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & " " & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & " " & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & " " & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd)

Random_Phone = s

End Function
[/vba]

Соответственно, когда мне нужно сгенерировать рандомный телефон, я в ячейку ввожу =@Random_Phone(7) и получаю телефон в формате +7 и 10 рандомных цифр.
Когда мне нужно рандомное имя и фамилия, я пишу =@Random_Name(4;7) & " " &@ Random_Name(6;10) получается имя от 4 до 7 букв и фамилия от 6 до 10.
Все работает, но регулярно сталкиваю с одинаковыми фамилиями, именами и даже парами "Имя+фамилия"

Вот например всего 19 строк, а 2 одинаковые фамилии:
Dqaoncu Bwiwcyihsa
Apgerfe Pelyymqyk
Wydvuoj Vmuktioc
Slurzac Ysohxyjx
Efkeqit Ltuxgorsy
Mguyf Ssantom
Xbadw Slurzacyls
Vkeoq Xinsoemv
Yndoqu Pjijlya
Uwerfi Hitlotsyg
Lrybcyl Shyzjyzgi
Oxiins Pmyfpih
Czaagop Zfohwau
Exhifvu Tvoknaqjo
Hkiitj Yojsojqunm
Xetaz Hketaxpe
Xlevt Tvoknaqjo
Ovgiu Kmobvurayk
Kfimui Hkiitjyxo

Иногда это мешает, потому что в системе, куда импортируется этот рандомный контент есть дедупликация и похожие строки могут отсеиваться.
Может кто-нибудь подсказать, как сделать рандом более рандомным?
 
Ответить
СообщениеДобрый день!
Я не очень опытный писатель макросов, столкнулся с проблемой, когда делал следующее:
Мне нужно было заполнить одну БД рандомными именами и телефонами.
Я создал такие две функции:
[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)

End If
End If
End If
AddChar = s
End Function

Function Random_Phone(pr As String)
Dim s As String
Randomize
s = "+" & pr & " " & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & " " & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & " " & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd) & " " & Int((9 + 1) * Rnd) & Int((9 + 1) * Rnd)

Random_Phone = s

End Function
[/vba]

Соответственно, когда мне нужно сгенерировать рандомный телефон, я в ячейку ввожу =@Random_Phone(7) и получаю телефон в формате +7 и 10 рандомных цифр.
Когда мне нужно рандомное имя и фамилия, я пишу =@Random_Name(4;7) & " " &@ Random_Name(6;10) получается имя от 4 до 7 букв и фамилия от 6 до 10.
Все работает, но регулярно сталкиваю с одинаковыми фамилиями, именами и даже парами "Имя+фамилия"

Вот например всего 19 строк, а 2 одинаковые фамилии:
Dqaoncu Bwiwcyihsa
Apgerfe Pelyymqyk
Wydvuoj Vmuktioc
Slurzac Ysohxyjx
Efkeqit Ltuxgorsy
Mguyf Ssantom
Xbadw Slurzacyls
Vkeoq Xinsoemv
Yndoqu Pjijlya
Uwerfi Hitlotsyg
Lrybcyl Shyzjyzgi
Oxiins Pmyfpih
Czaagop Zfohwau
Exhifvu Tvoknaqjo
Hkiitj Yojsojqunm
Xetaz Hketaxpe
Xlevt Tvoknaqjo
Ovgiu Kmobvurayk
Kfimui Hkiitjyxo

Иногда это мешает, потому что в системе, куда импортируется этот рандомный контент есть дедупликация и похожие строки могут отсеиваться.
Может кто-нибудь подсказать, как сделать рандом более рандомным?

Автор - Georg_IV8735
Дата добавления - 15.12.2022 в 23:06
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Плохо рандомизирует рандом (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2023 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!