Vb6 Как сделать случайную строку из 0-9 и a-z из x символов - PullRequest
11 голосов
/ 15 ноября 2008

Пытаетесь создать случайную строку длиной x символов, используя 0-9 и a-z / A-Z, и не можете найти хороший пример, есть идеи?

Ответы [ 8 ]

27 голосов
/ 15 ноября 2008
Function RandomString(cb As Integer) As String

    Randomize
    Dim rgch As String
    rgch = "abcdefghijklmnopqrstuvwxyz"
    rgch = rgch & UCase(rgch) & "0123456789"

    Dim i As Long
    For i = 1 To cb
        RandomString = RandomString & Mid$(rgch, Int(Rnd() * Len(rgch) + 1), 1)
    Next

End Function

Обратите внимание, что встроенный генератор случайных чисел не защищен криптографически, поэтому подобная функция не должна использоваться для генерации паролей.

1 голос
/ 27 мая 2009

Вдохновленный этим вопросом, я задал аналогичный вопрос , где я предлагаю использовать GUID для генерации последовательности. Недостаток этого, как я отмечаю, заключается в том, что если в моей логике нет других недостатков, то это будет случайная последовательность от A до F и 10 цифр. Если вы можете смириться с тем, что буквы от G до Z отсутствуют, это может быть решением для вас.

1 голос
/ 27 мая 2009

Метод Джоэля в порядке (за исключением переменной целочисленного цикла и использования «+» для конкатенации). (-:

Однако вывод можно сделать более интересным несколькими способами.

Во-первых, вы можете генерировать строки, которые имеют такое же приблизительное частотное распределение, что и обычный английский текст, создавая начальную строку с гораздо большим количеством символов Ee и Tt, чем символов Zz. Строка из 1000 символов (вдвое больше, чем в смешанном регистре) в , это приблизительное сочетание будет работать нормально.

Добавьте в равных числах 0,9 символа в любом соотношении, которое вы хотели бы видеть в конечном выводе. Вы также можете перетасовать эту строку, чтобы она выглядела более случайной, но это не имеет значения.

Затем используйте случайный селектор в диапазоне 1..Len (начальная строка), чтобы выбрать каждый символ, как в примере Джоэла.

Зачем это? Нет веской причины, за исключением того, что результаты будут выглядеть более знакомыми.

Второй вариант - сгенерировать две такие начальные строки, одну из согласных по массе корпуса, а другую с гласными в том же весе (больше Е, чем О, чем, и т. Д.). Я бы использовал только один случай, а не смешанный случай.

Затем чередуйте два случайных выбора, сначала из согласных, затем из гласных, чтобы генерировать орграфы, такие как TI, WO, DE и так далее. Объедините их в цепочку, чтобы сформировать «слова».

Поскольку полученный результат можно произносить, его гораздо легче запомнить. Плюс, это выглядит до жути японским. (-:

Наша библиотека Stamina (функции ASM для VB / VBA) содержит подпрограммы, которые делают это, но в чистом VB это достаточно просто.

1 голос
/ 15 ноября 2008

Я забыл все свои VB6 (слава Богу), но в псевдокоде это довольно просто:

    all_chars = an array of all the valid chars
    seed random number generator
    for i = 1 to x do
        random_index = get a random number between 1 and length of all_chars
        'I remember how to concat and comment in VB6 :-)
        string = string & all_chars[random_index] 
    end for

    done!

Так что это просто вопрос выяснения, как создать массив и заполнить его символами, как получить длину массива и как получить случайное число между первым и последним индексами указанный массив.

Ну, все это и цикл, конечно.

0 голосов
/ 02 июля 2016

Если вы используете базу данных SQL, вы можете сгенерировать PrimaryKey следующим образом:

SELECT NEWID() as KeyValue

Это очень хороший способ и очень безопасный.

0 голосов
/ 27 мая 2009

Вы действительно не сказали, для чего вы это использовали. Если вам нужны небольшие строки (<= 32 766), я думаю, что функция Джоэла будет работать нормально. Однако, если вам нужно что-то для генерации действительно больших строк, это может быть полезно. В моей системе он будет выполнять 1 000 000 символьных строк за 0,33291015625 секунд (да, я знаю ... кувалду :)) Также вы можете параметризовать набор символов, чтобы вам не приходилось менять код каждый раз, когда вы хотите что-то сделать «особенным» ":): <br />

Public Function RandomString( _
    ByVal length As Long, _
    Optional charset As String = "abcdefghijklmnopqrstuvwxyz0123456789" _
    ) As String
    Dim chars() As Byte, value() As Byte, chrUprBnd As Long, i As Long
    If length > 0& Then
        Randomize
        chars = charset
        chrUprBnd = Len(charset) - 1&
        length = (length * 2&) - 1&
        ReDim value(length) As Byte
        For i = 0& To length Step 2&
            value(i) = chars(CLng(chrUprBnd * Rnd) * 2&)
        Next
    End If
    RandomString = value
End Function
0 голосов
/ 26 мая 2009

Используя алгоритм Винко Врсаловича, вот код функции, спасибо и cya!

all_chars = array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","S","T","U","V","W","X","Y","Z")
Randomize
for i = 1 to 4
   random_index = int(Rnd()*25)
clave = clave & all_chars(random_index) 
next
0 голосов
/ 15 ноября 2008

Использовать Randomize
Int (Rnd * высокая граница) + (низкая граница) сгенерирует случайное число
Создайте массив со значениями от asc ("a") до asc ("z") и от asc ("0") до asc ("9")
Сгенерируйте случайное число от 1 до 26 (10 + 26) и найдите его в массиве.

VB6 больше не установлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...