Случайное четырехзначно число без повторяющихся цифр

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

Случайное четырехзначно число без повторяющихся цифр

Сообщение Alt » 09.07.2009 (Чт) 12:44

Скажу сразу я только учусь) поэтому вопрос может быть групым, но все же задам
Код: Выделить всё
i = Int(Rnd * 10000)
       
    Do While ai = 10000
        ai = Int(Rnd * 10000)
    Loop
x = 0

    Do While Not x = 16
            y = y + 1
        For b = 1 To 4
            For c = 1 To 4
                If Mid(ai, b, 1) = Mid(ai, b + c, 1) Then a = a Else x = x + 1
            Next c
            Next b
        If y = 16 Then x = 0 And ai = Int(Rnd * 10000)
    Loop

Эта часть кода должна генерить рандомное число в котором нет повторяющихся цифр(например 1223-нельзя), и которое не равно 10000. Но почему то если генерируется число в котором есть повторяющиеся цифры то этот цикл который должен это исправить просто зацикливается. Прошу указать на ошибку

Почти тот же самый цикл который проверяет на те же условия число пользователя работает
Код: Выделить всё
a = Text1
If Len(a) <> 4 Then
    MsgBox ("Ваше число должно состоять из 4 цифр")
Else
    For b = 1 To 4
        For c = 1 To 4
            If Mid(a, b, 1) = Mid(a, b + c, 1) Then MsgBox ("В числе не должно быть одинаковых цифр") Else x = x + 1
        Next c
        Next b
End If

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение Денис » 09.07.2009 (Чт) 12:56

Alt писал(а):Но почему то если генерируется число в котором есть повторяющиеся цифры то этот цикл который должен это исправить просто зацикливается. Прошу указать на ошибку


Эт я тоже на этом попадался раньше. Юзай Mid$ вместо Mid (потому что $-функция работает со строками, а другая работает с переменной типа Variant, которая тормозная и глючная). Второе: пержде всего юзай конвертацию в строковое значение MyString = CStr$(MyValue). И третье: Явно объявляй все переменные as Long, as String например, а то они все по умолчанию у тебя as Variant - как сказано выше, тормозные и глючные.

Перепиши код согласно моим рекомендациям и сам увидишь, в чем ошибка. А если не увидишь, тогда выкладывай переписанный код сюда, будем разбирать.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

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

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение alibek » 09.07.2009 (Чт) 13:19

Alt писал(а):Прошу указать на ошибку

Ошибка в мозгу.
Логика должна быть совсем другой:
1. Составляешь список возможных значений (0, 1, ..., 9)
2. Выбрать случайный элемент из списка, выбранный элемент добавить к создаваемому значению, удалить из исходного списка
3. Повторить п.1 нужное число раз.
Lasciate ogni speranza, voi ch'entrate.

Alt
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 08.07.2009 (Ср) 18:52

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение Alt » 09.07.2009 (Чт) 13:21

Если честно не очень понял когда именно нужно конвертировать. А объявлял я их и так as string просто здесь я привел только часть кода где этого не видно. Переделал. Не работает
Код: Выделить всё
ai = Int(Rnd * 10000)
       
    Do While ai = 10000
        ai = Int(Rnd * 10000)
    Loop
x = 0
    ai = CStr(ai)
    Do While Not x = 16
            y = y + 1
        For b = 1 To 4
            For c = 1 To 4
                If Mid$(ai, b, 1) = Mid$(ai, b + c, 1) Then a = a Else x = x + 1
            Next c
            Next b
        If y = 16 Then x = 0 And ai = Int(Rnd * 10000) And ai = CStr(ai)
    Loop


alibek , вы говорите так как будто существует всего один верный алгоритм для выполнения этой задачи. Хотя мне нравится ваш способ :)

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

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение alibek » 09.07.2009 (Чт) 13:32

Alt писал(а):alibek , вы говорите так как будто существует всего один верный алгоритм для выполнения этой задачи. Хотя мне нравится ваш способ :)

А какие еще существуют?
Lasciate ogni speranza, voi ch'entrate.

Alt
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 08.07.2009 (Ср) 18:52

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение Alt » 09.07.2009 (Чт) 13:39

Вот который я привел выше. Только в нем какая то ошибка)
Тогда объясните пожалуйста на примере ваш вариант, потому что у меня и с ним трабла

Код: Выделить всё
gen = 123456789
   
    Do While Not Len(ai) = 4
            x = (Int(Rnd * 10) + Len(ai) - 10)
            ai = Mid(gen, x, 1)
    Loop

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение iGrok » 09.07.2009 (Чт) 14:24

Alt писал(а):Тогда объясните пожалуйста на примере ваш вариант, потому что у меня и с ним трабла

Код: Выделить всё
Dim vals As String, out As String, i As Long, t As Long
vals = "123456789"
Randomize
For i = 1 To 4
  t = (Int(Rnd * Len(vals)) + 1)
  out = out & Mid$(vals, t, 1)
  vals = Left$(vals, t - 1) & Mid$(vals, t + 1)
Next i
Debug.Print out
label:
cli
jmp label

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение pronto » 10.07.2009 (Пт) 2:49

vals = "123456789"

vals = "0123456789" или vals = "1234567890". Всё-таки подразумевается десятичная система, а не «девятиричная».
O, sancta simplicitas!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение iGrok » 10.07.2009 (Пт) 12:16

pronto писал(а):
vals = "123456789"

vals = "0123456789" или vals = "1234567890". Всё-таки подразумевается десятичная система, а не «девятиричная».

Какой набор символов он дал, из того я и генерил.

А так, по хорошему, надо брать с нулём, но делать проверку на то, чтобы первый символ не был нулём.

Код: Выделить всё
...
vals = "1234567890"
...
  If i = 1 Then
    t = (Int(Rnd * Len(vals) - 1) + 1)
  Else
    t = (Int(Rnd * Len(vals)) + 1)
  End If
...
label:
cli
jmp label

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

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение Хакер » 10.07.2009 (Пт) 12:53

Не надо делать проверку, надо добавлять 0 в список после генерации первого символа.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Случайное четырехзначно число без повторяющихся цифр

Сообщение iGrok » 10.07.2009 (Пт) 14:29

Хакер писал(а):Не надо делать проверку, надо добавлять 0 в список после генерации первого символа.

Точно!
label:
cli
jmp label


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 26

    TopList