Как сгенерировать случайную букву?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
PAVEL_USER
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 18:04

Как сгенерировать случайную букву?

Сообщение PAVEL_USER » 17.10.2006 (Вт) 14:47

Подскажите пожалуйста, как сгенерировать случайный буквенный символ?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 17.10.2006 (Вт) 14:49

Rnd + твоя фантазия в рамках диапазона числового представления нужных букв

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.10.2006 (Вт) 14:49

Совместив Chr и Rnd.
Lasciate ogni speranza, voi ch'entrate.

PAVEL_USER
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 18:04

Сообщение PAVEL_USER » 17.10.2006 (Вт) 15:17

А можно точнее, как именно это сделать?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.10.2006 (Вт) 15:22

Точнее некуда.
Дальше только думать.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 17.10.2006 (Вт) 15:23

Точнее некуда.
Дальше только думать.


:cheers:

надо в цитаты повесить :lol:

alleonid
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 14.07.2005 (Чт) 7:01

Re: Как сгенерировать случайную букву?

Сообщение alleonid » 17.10.2006 (Вт) 19:16

[quote="PAVEL_USER"]Подскажите пожалуйста, как сгенерировать случайный буквенный символ?[/quote]

1. Генерируете псевдослучайное число X, равномерно-распределенное в интервале - лучше сразу от 0 до 32 (или сколько их там?).
2. Далее пишете код суть которого:
If 0<=X<1 Then Y="а"
If 1<=X<2 Then Y="б"
If 2<=X<3 Then Y="в"
...
Или все тоже самое в цикле одной строкой.

Денис Победря
Мегобойанист
Мегобойанист
 
Сообщения: 1037
Зарегистрирован: 03.01.2005 (Пн) 21:29
Откуда: Из Москвы

Сообщение Денис Победря » 17.10.2006 (Вт) 19:23

:lol:
Код: Выделить всё
randomize
chr$(rnd*кол_во_русских_букв+номер_первой_буквы)
[Место cдаётся]

PAVEL_USER
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 13.10.2006 (Пт) 18:04

Сообщение PAVEL_USER » 17.10.2006 (Вт) 19:50

Еще можно так:

Код: Выделить всё
Dim massiv(10) As String
Dim x as String
'
'
'

massiv(0) = "я"
massiv(1) = "a"
massiv(2) = "б"
massiv(3) = "в"
'и так далее....
x = massiv(Int(Rnd * 10))

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.10.2006 (Вт) 20:30

[вырезано самим же собой]

x = Chr(Int(Rnd * 32) + Asc("а"))

Кстати, можно ещё так:
Делаете на экране надпись "Press any key"
Случайнее некуда :lol:
Последний раз редактировалось Хакер 17.10.2006 (Вт) 22:56, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 17.10.2006 (Вт) 22:29

Генерирование много чего...
Целый модуль, с функциями по генерированию
1 маленьких и больших англ. букв
2 HEX букв
3 CLSID
4 Генерация по заданному формату (моя любимая, над ней сидел несколько часов)
5 Цифр

Код: Выделить всё
Attribute VB_Name = "mdlGenerate"
Private Const HEXletter = "ABCDEFabcdef"

Public Function GenerateID() As String
    GenerateID = FormatGenerator(6, 5, " - ")
End Function
Public Function GenerateLetter() As String
    'Randomize
    Dim temp As Integer
   
    Do Until (temp > 65) And (temp <> 91) And (temp <> 92) And (temp <> 93) And (temp <> 94) And (temp <> 95) And (temp <> 96) And (temp < 122)
        temp = Int(Rnd() * 1000)
    Loop
    GenerateLetter = Chr(temp)
End Function
Public Function Generate_A_Z_1() As String
    'Randomize
    Dim temp As Integer
   
    Do Until (temp > 65) And (temp < 91)
        temp = Int(Rnd() * 1000)
    Loop
    Generate_A_Z_1 = Chr(temp)
End Function
Public Function Generate_a_z_2() As String
    'Randomize
    Dim temp As Integer
   
    Do Until (temp > 96) And (temp < 122)
        temp = Int(Rnd() * 1000)
    Loop
    Generate_a_z_2 = Chr(temp)
End Function
Public Function GenerateHEXletter() As String
'Randomize
Dim temp As String
On Error Resume Next
temp = "!"
    Do Until InStr(1, HEXletter, temp) > 0
        temp = Chr(Rnd() * 255)
    Loop
GenerateHEXletter = temp
End Function

Public Function GenerateNumber() As Byte
    'Randomize
    GenerateNumber = Int(Rnd() * 10)
End Function

Public Function TextToNumber(Text As String) As String
    Dim i As Long
    Dim letter As String
        For i = 1 To Len(Text)
            letter = Mid(Text, i, 1)
            TextToNumber = TextToNumber & Asc(letter)
        Next
End Function

Public Function FormatGenerator(SectorsInCode As Long, CharsInSector As Long, Separator As String, Optional Numbers As Boolean = True, Optional BigChars As Boolean = True, Optional SmallChars As Boolean = True, Optional HEXchars As Boolean = False) As String
If Numbers = False And BigChars = False And SmallChars = False And HEXchars = False Then Exit Function
    Randomize
    If SectorsInCode > 100 Then Exit Function
    Dim temp As Integer
    Dim temp2 As String
    Dim code As String
    Dim CIS(1 To 100)  As String
    Dim i As Long, j As Long
   
    For j = 1 To SectorsInCode
        For i = 1 To CharsInSector
go1:
            Do
                temp = CInt(Rnd() * 10)
            Loop Until (temp = 1) Or (temp = 2) Or (temp = 3) Or (temp = 4)
           
            If temp = 1 And BigChars = True Then
                temp2 = temp2 & Generate_A_Z_1
            ElseIf temp = 4 And SmallChars = True Then
                temp2 = temp2 & Generate_a_z_2
            ElseIf temp = 2 And Numbers = True Then
                temp2 = temp2 & GenerateNumber
            ElseIf temp = 3 And HEXchars = True Then  ' Then '
                temp2 = temp2 & GenerateHEXletter
            Else
                GoTo go1
            End If
            temp = 0
        Next
        CIS(j) = temp2
        temp2 = ""
        If code <> "" Then
            code = code & Separator & CIS(j)
        Else
            code = CIS(j)
        End If
    Next
   
    FormatGenerator = code
End Function

Public Function NumberAndText(Number As Long) As String
If Right(Number, 1) = Number Then
    If Right$(Number, 1) = 0 Or Right$(Number, 1) = 5 Or Right$(Number, 1) = 6 Or Right$(Number, 1) = 7 Or Right$(Number, 1) = 8 Or Right$(Number, 1) = 9 Then NumberAndText = Number & " частей"
    If Right$(Number, 1) = 1 Then NumberAndText = Number & " часть"
    If Right$(Number, 1) = 2 Or Right$(Number, 1) = 3 Or Right$(Number, 1) = 4 Then NumberAndText = Number & " части"
Else
    NumberAndText = Number & " частей"
End If
End Function

Public Function GenerateCLSID() As String
    Randomize
    Dim i As Byte
    Dim Gen As String
    Dim temp As Integer
   
    'Gen = "{"
   
    For i = 1 To 8
        Do Until (temp = 1) Or (temp = 2) Or (temp = 3) Or (temp = 4) ' Or (temp = 5) Or (temp = 6)
            temp = CByte(Rnd() * 10)
        Loop
        If temp = 1 Then
            Gen = Gen & GenerateHEXletter
        Else
            Gen = Gen & GenerateNumber
        End If
        temp = 0
    Next
    'XXXXXXXX
    i = 0
    Gen = Gen & "-"
   
    For i = 1 To 4
        Do Until (temp = 1) Or (temp = 2) Or (temp = 3) Or (temp = 4) 'Or (temp = 5) Or (temp = 6)
            temp = CByte(Rnd() * 10)
        Loop
        If temp = 1 Then
            Gen = Gen & GenerateHEXletter
        Else
            Gen = Gen & GenerateNumber
        End If
        temp = 0
    Next
    'XXXXXXXX-XXXX
    i = 0
    Gen = Gen & "-"
   
    For i = 1 To 4
        Do Until (temp = 1) Or (temp = 2) Or (temp = 3) Or (temp = 4) 'Or (temp = 5) Or (temp = 6)
            temp = CByte(Rnd() * 10)
        Loop
        If temp = 1 Then
            Gen = Gen & GenerateHEXletter
        Else
            Gen = Gen & GenerateNumber
        End If
        temp = 0
    Next
    'XXXXXXXX-XXXX-XXXX
    i = 0
    Gen = Gen & "-"
   
    For i = 1 To 4
        Do Until (temp = 1) Or (temp = 2) Or (temp = 3) Or (temp = 4) 'Or (temp = 5) Or (temp = 6)
            temp = CByte(Rnd() * 10)
        Loop
        If temp = 1 Then
            Gen = Gen & GenerateHEXletter
        Else
            Gen = Gen & GenerateNumber
        End If
        temp = 0
    Next
    'XXXXXXXX-XXXX-XXXX-XXXX
    i = 0
    Gen = Gen & "-"
   
    For i = 1 To 12
        Do Until (temp = 1) Or (temp = 2) Or (temp = 3) Or (temp = 4) 'Or (temp = 5) Or (temp = 6)
            temp = CByte(Rnd() * 10)
        Loop
        If temp = 1 Then
            Gen = Gen & GenerateHEXletter
        Else
            Gen = Gen & GenerateNumber
        End If
        temp = 0
    Next
   
    GenerateCLSID = Gen '& "}"
End Function


Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.10.2006 (Вт) 22:32

Для генерации CLSID есть вообщето специальная API-функция.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 17.10.2006 (Вт) 22:43

когда писал - не знал, а кстати какая?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.10.2006 (Вт) 22:44

Во-первых, не CLSID это, а GUID.
А во-вторых, Хакер, я бы сообщение на твоем месте откорректировал. Не верю я в "не сдержался" там, где текст пишется, а не произносится.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.10.2006 (Вт) 22:47

Например эта:
Код: Выделить всё
Private Declare Function CoCreateGuid Lib "ole32" (id As Any) As Long
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.10.2006 (Вт) 22:48

MIT, например такая:
Код: Выделить всё
Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(0 To 7) As Byte
End Type
Declare Function CoCreateGuid Lib "OLE32.DLL" (pGUID As GUID) As Long
Declare Function StringFromGUID2 Lib "OLE32.DLL" (pGUID As GUID, ByVal sGUID As String, ByVal MaxLength
As Long) As Long
...
Function CreateGUID2() As String
Dim G As GUID, S As String, I As Long
Call CoCreateGuid(G)
S = Space$(128)
I = StringFromGUID2(G, S, Len(S))
If I = 0 Then Exit Function
CreateGUID2 = Left$(StrConv(S, vbFromUnicode), I - 1)
End Function


Твоя же функция будет создавать набор символов, но никак не GUID.
Lasciate ogni speranza, voi ch'entrate.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 17.10.2006 (Вт) 22:58

Круто, но я все равно этого не знал. Извиняйте.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.10.2006 (Вт) 22:58

alibek
Поскольку автор использовал CLSID я и стал его писать не произвольно. А в действительности да, это guid.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 17.10.2006 (Вт) 23:20

Я когда то делал так:
a=int(rnd*x)+y
в этом случае диапозон получаемых случайных значений 'a'(в нашем случае код символа) будет от 'y' до 'x+y'
если надо исключить определенные
символы (имеется ввиду коды символов), то делаем IF THEN, получить символ из кода CHR$(код символа), а узнать код символа ASC("символ")

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.10.2006 (Ср) 7:09

Вообще Chr(Rnd) редко имеет практический смысл. Гораздо более полезно Mid(Rnd).
Lasciate ogni speranza, voi ch'entrate.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Сообщение MIT » 18.10.2006 (Ср) 14:04

А что дает Mid(Rnd) ?

По моему так лучше всего

[vb]
Public Function GenerateLetter() As String
'Randomize
Dim temp As Integer

Do Until (temp > 65) And (temp <> 91) And (temp <> 92) And (temp <> 93) And (temp <> 94) And (temp <> 95) And (temp <> 96) And (temp < 122)
temp = Int(Rnd() * 1000)
Loop
GenerateLetter = Chr(temp)
End Function
[\vb]

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.10.2006 (Ср) 14:15

как все запущено то...

1. Создается строка S с необходимыми символами, длиной N.
2. Далее генерится целое число из диапазона 1 - N, по формуле rndN = Int((N*Rnd) + 1)
3. Функцией Mid вырезаем нужный символ rndChar = Mid$(S, rndN, 1)

и всех делов....

З.Ы. А вопрос этот пора в FAQ
Весь мир матрица, а мы в нем потоки байтов!

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 18.10.2006 (Ср) 16:34

Ну и еще два разных способа генерации английской буквы.

chr (Int(Rnd() * 26) + 32 * (Int(Rnd() * 2) + 1) + 33)
И
chr((Int(Rnd() * 26) + 3.5) * (Int(Rnd() * 2) * 2 - 1) + 93.5)

При этом в коде обязательно стоит оставить комментарий типа:
"А теперь попробуй понять что я тут и нафига делаю"
:lol:

PS Придумать идею оказывается гораздо проще, чем подогнать коэффициенты.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.10.2006 (Ср) 16:59

GAGArin, не зачтено.
Были бы гиперболические функции, или хотя бы тригонометрические.
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 18.10.2006 (Ср) 17:43

Сто лет назад, у меня была такая проблема.

Я ее решил так:



Код: Выделить всё


const alphabet as string="abcdefghijklmnopqrstuvwyz"

function randchar as string

randchar=mid(alphabet,round(rnd*len(alphabet)),1)

end function

Последний раз редактировалось RayShade 19.10.2006 (Чт) 9:37, всего редактировалось 1 раз.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.10.2006 (Ср) 21:49

Поправочка: не round, а rnd* :)

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 18.10.2006 (Ср) 23:12

alibek
Хотел бы я посмотреть на геперболическую функцию, которая несла бы смысл. Тоесть не простая добавка и сокращение, а логичное использование в генерации буковок.

Лично мне второй мой способ пришел в голову сразу после постановки проблемы.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.10.2006 (Ср) 23:44

GAGArin, да легко.
Например для модуляции распределения (когда нужно не равномерное, а другое).
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 19.10.2006 (Чт) 9:37

Amed

Поправочка, и round и rnd :)

yaklit
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 129
Зарегистрирован: 09.09.2006 (Сб) 19:38

Сообщение yaklit » 19.10.2006 (Чт) 21:05

Хм. какая огромная тема и какой маленький вопрос. :lol:

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Majestic-12 [Bot], Yandex-бот и гости: 18

    TopList