Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: генерация случайных букв Добавлено: 05.08.06 15:31  

Автор вопроса:  Dixon | ICQ: 262-393-953 
задумал я написать генератор паролей, и хотелось бы узнать, существует ли какая-нибудь функция для случайного генерирования букв и других знаков, аналог функции Rnd для чисел

Ответить

  Ответы Всего ответов: 31  

Номер ответа: 1
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #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-сайт: 4elovekssn.blog.ru
 Профиль | | #4
Добавлено: 05.08.06 17:53
Как вариант:
Randomize
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
вроде написал, только в коде получилось очень много повторяющихся элементов, а как разбить выделить процедуру я не вижу. Вот код:
If 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 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-сайт: 4elovekssn.blog.ru
 Профиль | | #6
Добавлено: 05.08.06 19:11
Ну точно, прям с ходу
Do
                nRnd = Round(255 * Rnd)
            Loop Until (nRnd >= 48 And nRnd <= 57)

Менять на
nRnd = Round((57 - 48 + 1) * Rnd + 48) '57-48+1, чтоб понятней

Ответить

Номер ответа: 7
Автор ответа:
 Calhoon



ICQ: 789764 

Вопросов: 90
Ответов: 230
 Web-сайт: 4elovekssn.blog.ru
 Профиль | | #7
Добавлено: 05.08.06 19:22
Ну и, к примеру, здесь:
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)

также выставляй минимум 48, максимум 122, смысла перебирать меньше/больше нет...

А вообще в плане кода сократить можно, но в плане быстроты работы, имхо, почти нечего сокращать кроме более грамотного расставления пределов, см. выше

Ответить

Номер ответа: 8
Автор ответа:
 Dixon



ICQ: 262-393-953 

Вопросов: 8
Ответов: 78
 Профиль | | #8 Добавлено: 05.08.06 19:26
Но так ведь можно сделать только в 2 местах! А как же быть в остальных случаях? Кста, я забыл вставить про знаки. Так что вот полный код:
If chkNumbers.Value And chkCyrillic.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 >= 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-сайт: hunger.ru
 Профиль | | #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(a), GenerateNumber(1, Len(ArrAlp(a))), 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-сайт: hunger.ru
 Профиль | | #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-сайт: 4elovekssn.blog.ru
 Профиль | | #13
Добавлено: 05.08.06 19:55
Делать было нечего, код сократил, откатал тебе функцию по первому коду, для символов еще сам добавишь по аналогии:
Private Function RndChars(Numbers As Boolean, Cyrillic As Boolean, Latin As Boolean, Length As Long) As String
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-сайт: hunger.ru
 Профиль | | #15
Добавлено: 05.08.06 19:59
ArrAlp - это массив который по сути является алфавитом, т.е. если ты выбрал Русские символы и Цифры, то этот массив будет равен:

ArrAlp(0) = "йцукенгшщзхъфывапролджэячсмитьбю"
ArrAlp(1) = "1234567890"

ReDim Preserve - это в справочник.

а j-1 это кол-во элементов в массиве(в примере выше их два например).

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам