|
'S - везде искомая строка - пароль 't - врем. переменная хран. код символа 'p1, p2 , p3 - число определяющее вероятность выбора цифры, заглавной или строчной буквы соответственно ' это не относительная вероятность! она будет высчитываться как p1/(p1+p2+p3), p2/(p1+p2+p3) и p3/(p1+p2+p3)
Private Sub n1() ' В итоге цифры встречаются в 5 раз реже, так как равномерно распределено пространство 'между всеми символами, букв 52(2*26), а цифр 10... :( Уже неправильно Randomize Dim s As String Dim i as integer, t as integer For i = 1 To 10 Do t = 48 + CInt(Rnd * 74) Select Case t Case Is < 58: ' t=t Case Is < 65: t = 0 Case Is < 91: ' t=t Case Is < 97: t = 0 End Select Loop Until t s = s & Chr$(t) Next i Debug.Print s End Sub
Private Sub n2() ' Равномерное распределение по группам дает некоторое преимущество, но все еще не упорядочивает ' сам пароль. Randomize Dim s As String Dim i as inеeger, t as integer For i = 1 To 10
Select Case CInt(Rnd * 2) Case 0: t = 48 + CInt(Rnd * 9) Case 1: t = 65 + CInt(Rnd * 25) Case 2: t = 97 + CInt(Rnd * 25) End Select s = s & Chr$(t) Next i Debug.Print s End Sub
Private Sub n3() ' Более точное распределение по позициям символов, так называемое "с памятью", 'т.е. с зависимостью от предыдущих символов Randomize Dim s As String, n As Integer Dim p1 As Single, p2 As Single, p3 As Single
p1 = 1: p2 = 1: p3 = 1
Select Case CInt(Rnd * (p1 + p2 + p3)) Case Is < p1: p2 = 2: p3 = 2 t = 48 + CInt(Rnd * 9) Case Is < p2: p1 = 2: p3 = 2 t = 65 + CInt(Rnd * 25) Case Else: p1 = 2: p2 = 2 t = 97 + CInt(Rnd * 25) End Select s = Chr$(t) For i = 2 To 10
Select Case CInt(Rnd * (p1 + p2 + p3)) Case Is < p1: If n = 1 Then p2 = p2 * 2: p3 = p3 * 2 Else p1 = 1: p2 = 1: p3 = 1 n = 1 t = 48 + CInt(Rnd * 9) Case Is < p1 + p2: If n = 2 Then p1 = p1 * 2: p3 = p3 * 2 Else _ p2 = 1: p3 = 1: If n = 1 Then p1 = 1 Else p1 = p1 * 2 n = 2 t = 65 + CInt(Rnd * 25) Case Else: If n = 3 Then p1 = p1 * 2: p2 = p2 * 2 Else _ p2 = 1: p3 = 1: If n = 1 Then p1 = 1 Else p1 = p1 * 2 n = 3 t = 97 + CInt(Rnd * 25) End Select s = s & Chr$(t) Next i Debug.Print s
End Sub
' Если мы добавили к паролю, например, цифру, то вероятность добавления после не буквы будет в 2 раза больше, т.е. ' сначала распределялись как (1,1,1) значит вероятность появления символа любой группы 1/3, после добавления цифры ' (1,2,2) - вероятность появления цифры 1/5, буквы заглавной 2/5, и строчной тоже 2/5, после добавления еще цифры ' 5=1+2+2 ' (1,4,4) - вероятность появления цифры 1/9, буквы заглавной 4/9, и строчной тоже 4/9, после добавления еще цифры ' 9 = 1+4+4 ' Остается еще одна проблема - в пароле могут меняться местами только буквы - т.е. ЗАГЛАВНАЯстрочнаяЗАГЛАВНАЯстрочная ' и т.д. - поэтому вероятность появления цифры не падает:
' R4B3rTYe5 'Вероятности после каждого символа: R(2,1,2)4(1,1,1),B(1,1,1)3(1,1,1)r(1,1,1)T(2,1,1)Y(4,1,2)e(8,1,1)5(1,1,1)
'!По хорошему также следует убрать при добавлении первого символа возможность поставить там цифру - ведь это не 'соответствует стандартам Автор: Ташланов Дмитрий, Dreamerland (собака) mail.ru.
|