Страница: 1 | 2 | 3 |
Вопрос: генерация случайных букв
Добавлено: 05.08.06 15:31
Автор вопроса: Dixon | ICQ: 262-393-953
задумал я написать генератор паролей, и хотелось бы узнать, существует ли какая-нибудь функция для случайного генерирования букв и других знаков, аналог функции Rnd для чисел
Ответы
Всего ответов: 31
Номер ответа: 1
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #1
Добавлено: 05.08.06 15:58
chr(round(f(rnd))) где ф(рнд) это функция где ты задаещь границы итд. Область значения - 0..255
Номер ответа: 2
Автор ответа:
Dixon
ICQ: 262-393-953
Вопросов: 8
Ответов: 78
Профиль | | #2
Добавлено: 05.08.06 16:08
сразу вопрос, а если у меня в облесть есть промежуток, т.е. например, 10-96 и 204-245, то как быть?
Номер ответа: 3
Автор ответа:
Dixon
ICQ: 262-393-953
Вопросов: 8
Ответов: 78
Профиль | | #3
Добавлено: 05.08.06 16:20
и как задать границы?
Номер ответа: 4
Автор ответа:
Calhoon
ICQ: 789764
Вопросов: 90
Ответов: 230
Web-сайт:
Профиль | | #4
Добавлено: 05.08.06 17:53
Как вариант:
Do
btChislo = Int((UPPER - LOWER + 1) * Rnd + LOWER)
Loop While (btChislo > 10 and btChislo < 96) or (btChislo > 204 and btChislo < 245)
strBukva = chr(btChislo)
Проблемы решаемы
Номер ответа: 5
Автор ответа:
Dixon
ICQ: 262-393-953
Вопросов: 8
Ответов: 78
Профиль | | #5
Добавлено: 05.08.06 18:49
вроде написал, только в коде получилось очень много повторяющихся элементов, а как разбить выделить процедуру я не вижу. Вот код:
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 192 And nRnd <= 255) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumber.Value And chkCyrillic.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 192 And nRnd <= 255)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumber.Value And chkLatin.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkCyrillic.Value And chkLatin.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 192 And nRnd <= 255) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumbers.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkCyrillic.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 192 And nRnd <= 255)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkLatin.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122)
txtPassword = txtPassword & Chr(nRnd)
Next i
End If
Помогите его сократить, если можно конечно.
Номер ответа: 6
Автор ответа:
Calhoon
ICQ: 789764
Вопросов: 90
Ответов: 230
Web-сайт:
Профиль | | #6
Добавлено: 05.08.06 19:11
Ну точно, прям с ходу
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57)
Менять на
Номер ответа: 7
Автор ответа:
Calhoon
ICQ: 789764
Вопросов: 90
Ответов: 230
Web-сайт:
Профиль | | #7
Добавлено: 05.08.06 19:22
Ну и, к примеру, здесь:
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 192 And nRnd <= 255) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122)
также выставляй минимум 48, максимум 122, смысла перебирать меньше/больше нет...
А вообще в плане кода сократить можно, но в плане быстроты работы, имхо, почти нечего сокращать кроме более грамотного расставления пределов, см. выше
Номер ответа: 8
Автор ответа:
Dixon
ICQ: 262-393-953
Вопросов: 8
Ответов: 78
Профиль | | #8
Добавлено: 05.08.06 19:26
Но так ведь можно сделать только в 2 местах! А как же быть в остальных случаях? Кста, я забыл вставить про знаки. Так что вот полный код:
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 192 And nRnd <= 255) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122) Or nRnd = 45 Or nRnd = 95
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumbers.Value And chkCyrillic.Value And chkLatin.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 192 And nRnd <= 255) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumbers.Value And chkCyrillic.Value And chkSigns.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 192 And nRnd <= 255) Or nRnd = 45 Or nRnd = 95
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumbers.Value And chkLatin.Value And chkSigns.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122) Or nRnd = 45 Or nRnd = 95
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkCyrillic.Value And chkLatin.Value And chkSigns.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 192 And nRnd <= 255) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122) Or nRnd = 45 Or nRnd = 95
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkCyrillic.Value And chkLatin.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 192 And nRnd <= 255) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumbers.Value And chkCyrillic.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 192 And nRnd <= 255)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumbers.Value And chkLatin.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkSigns.Value And chkLatin.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122) Or nRnd = 45 Or nRnd = 95
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkSigns.Value And chkCyrillic.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 192 And nRnd <= 255) Or nRnd = 45 Or nRnd = 95
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumbers.Value And chkSigns.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 48 And nRnd <= 57) Or nRnd = 45 Or nRnd = 95
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkNumbers.Value Then
For i = 1 To Val(txtLength.Text)
nRnd = Round((57 - 48 + 1) * Rnd + 48)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkCyrillic.Value Then
For i = 1 To Val(txtLength.Text)
nRnd = Round((255 - 192 + 1) * Rnd + 192)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkLatin.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until (nRnd >= 65 And nRnd <= 90) Or (nRnd >= 97 And nRnd <= 122)
txtPassword = txtPassword & Chr(nRnd)
Next i
ElseIf chkSigns.Value Then
For i = 1 To Val(txtLength.Text)
Do
nRnd = Round(255 * Rnd)
Loop Until nRnd = 45 Or nRnd = 95
txtPassword = txtPassword & Chr(nRnd)
Next i
End If
Номер ответа: 9
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #9
Добавлено: 05.08.06 19:32
Чем оптимизировать твой ужас, так лучше написать с нуля, вот, что получилось у меня:
Dim Alphabet
Private Sub CmdGen_Click()
Dim ArrAlp() As String
TxtPass.Text = ""
j = 0
ReDim ArrAlp(3)
For i = 0 To 3
If Check(i).Value = 1 Then ArrAlp(j) = Alphabet(i): j = j + 1
Next i
ReDim Preserve ArrAlp(j - 1)
For i = 1 To Val(TxtLen.Text)
a = GenerateNumber(0, j - 1)
TxtPass = TxtPass & Mid(ArrAlp, GenerateNumber(1, Len(ArrAlp)), 1)
Next i
End Sub
Private Function GenerateNumber(NumsLower As Integer, NumsUpper As Integer)
GenerateNumber = Int((NumsUpper - NumsLower + 1) * Rnd + NumsLower)
End Function
Private Sub Form_Load()
Randomize
Alphabet = Array("йцукенгшщзхъфывапролджэячсмитьбю", "qwertyuioplkjhgfdsazxcvbnm", "1234567890", "~!@#$%^&*()_+-*/<>?;:'{}[]"
End Sub
Форму можешь взять здесь:
http://hunger.ru/files/temp/PassGen.frm
Номер ответа: 10
Автор ответа:
Dixon
ICQ: 262-393-953
Вопросов: 8
Ответов: 78
Профиль | | #10
Добавлено: 05.08.06 19:42
не мог бы ты пояснить код? а то много чего не понятно
Номер ответа: 11
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #11
Добавлено: 05.08.06 19:45
Если тебе непонятно назначение той или иной функции, то это в справочник, а если непонятно что-то по самому алгоритму, то конкретизируй.
Номер ответа: 12
Автор ответа:
Dixon
ICQ: 262-393-953
Вопросов: 8
Ответов: 78
Профиль | | #12
Добавлено: 05.08.06 19:51
как я понял, сначала ты вводишь массив из 4 элементов (буквы кирилл и лат, цифры и знаки), а вот дальше:
за что у тебя отвечает массив ArrAlp и переменная j
потом ты проверяешь, отмечены ли чексбоксы, если да то... что? вот это место не понятно, ну и ещё что такое ReDim Preserve и почему ArrAlp(j - 1)
Номер ответа: 13
Автор ответа:
Calhoon
ICQ: 789764
Вопросов: 90
Ответов: 230
Web-сайт:
Профиль | | #13
Добавлено: 05.08.06 19:55
Делать было нечего, код сократил, откатал тебе функцию по первому коду, для символов еще сам добавишь по аналогии:
Randomize
Dim nRnd As Byte
Dim i As Long
If Numbers And Cyrillic And Latin Then
For i = 1 To Length
Do
nRnd = Round((255 - 48 + 1) * Rnd + 48)
Loop While (nRnd > 57 And nRnd < 65) Or (nRnd > 90 And nRnd < 97) Or (nRnd > 122 And nRnd < 192)
RndChars = RndChars & Chr(nRnd)
Next i
ElseIf Numbers And Cyrillic Then
For i = 1 To Length
Do
nRnd = Round((255 - 48 + 1) * Rnd + 48)
Loop While (nRnd > 57 And nRnd < 192)
RndChars = RndChars & Chr(nRnd)
Next i
ElseIf Numbers And Latin Then
For i = 1 To Length
Do
nRnd = Round((122 - 48 + 1) * Rnd + 48)
Loop While (nRnd > 57 And nRnd < 65) Or (nRnd > 90 And nRnd < 97)
RndChars = RndChars & Chr(nRnd)
Next i
ElseIf Cyrillic And Latin Then
For i = 1 To Length
Do
nRnd = Round((255 - 65 + 1) * Rnd + 65)
Loop While (nRnd > 90 And nRnd < 97) Or (nRnd > 122 And nRnd < 192)
RndChars = RndChars & Chr(nRnd)
Next i
ElseIf Numbers Then
For i = 1 To Length
nRnd = Round((57 - 48 + 1) * Rnd + 48)
RndChars = RndChars & Chr(nRnd)
Next i
ElseIf Cyrillic Then
For i = 1 To Length
nRnd = Round((255 - 192 + 1) * Rnd + 192)
RndChars = RndChars & Chr(nRnd)
Next i
ElseIf Latin Then
For i = 1 To Length
Do
nRnd = Round((122 - 65 + 1) * Rnd + 65)
Loop While (nRnd > 90 And nRnd < 97)
RndChars = RndChars & Chr(nRnd)
Next i
End If
End Function
Значения типа "255 - 48 + 1" замени на результат (208), эт для тебя оставил, для понятности.
Пользуйся
Номер ответа: 14
Автор ответа:
Dixon
ICQ: 262-393-953
Вопросов: 8
Ответов: 78
Профиль | | #14
Добавлено: 05.08.06 19:59
спасибо, только вот код бугора оказался намного короче, хотелось бы в нем разобраться
Номер ответа: 15
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #15
Добавлено: 05.08.06 19:59
ArrAlp - это массив который по сути является алфавитом, т.е. если ты выбрал Русские символы и Цифры, то этот массив будет равен:
ArrAlp(0) = "йцукенгшщзхъфывапролджэячсмитьбю"
ArrAlp(1) = "1234567890"
ReDim Preserve - это в справочник.
а j-1 это кол-во элементов в массиве(в примере выше их два например).