алгоритм "перемешки"

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

алгоритм "перемешки"

Сообщение ExiliM » 22.02.2010 (Пн) 4:53

Здраствуйте, интересует как реализовать перемешивание 52 значений.

То есть есть некий массив, либо разноименных переменных. Грубо говоря 52 числа. Как сделать что бы они вывелись списком, какое число за каким идёт. К примеру 5, 32, 2, 1....и т.д без повторов. Заранее спасибо.

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Re: алгоритм "перемешки"

Сообщение FaKk2 » 22.02.2010 (Пн) 8:00

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

вот псевдокод:
Код: Выделить всё
Randomize
For i = 0 To 52
   swap(arr (i), arr(rand(0, i)))
Next i
Последний раз редактировалось FaKk2 22.02.2010 (Пн) 21:39, всего редактировалось 1 раз.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Re: алгоритм "перемешки"

Сообщение Demonx » 22.02.2010 (Пн) 21:17

Изображение

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

Re: алгоритм "перемешки"

Сообщение Хакер » 22.02.2010 (Пн) 21:21

Что, даже никаких мыслей на тему того, что делает функция с таким названием?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 23.02.2010 (Вт) 2:00

Свап выглядит так?
Sub Swap(V1 As Variant, V2 As Variant)
Dim Mk As Variant
Mk = V2
V2 = V1
V1 = Mk
End Sub

arr - переменная, разобрался.
а на счёт ранд так и не понял...гуглил нашёл много всякой ерунды...распишите пожалуста по подробнее...

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Re: алгоритм "перемешки"

Сообщение FaKk2 » 23.02.2010 (Вт) 3:29

Код: Выделить всё
Function Random(min As Integer, max As Integer)
Random = Int(Rnd * (max - min)) + min
End Function


А, swap, да, такой. Только зачем Variant?
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 23.02.2010 (Вт) 3:46

Код: Выделить всё
Sub Swap(V1 As Byte, V2 As Byte)
Dim Mk As Byte
Mk = V2
V2 = V1
V1 = Mk
End Sub
Function Random(min As Byte, max As Byte)
Random = Int(Rnd * (max - min)) + min
End Function

Private Sub Command1_Click()
Dim arr As Byte
Randomize
For i = 0 To 52
Swap Arr(i), Arr(Random(0, i))
List1.AddItem i, i
Next i
End Sub


на аrr ругаеца, expected array. Пишу array, говорит "ByRef argument type mismatch" :(

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 23.02.2010 (Вт) 19:13

блин, всё не могу разобраться, помогите пож :)

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

Re: алгоритм "перемешки"

Сообщение Хакер » 23.02.2010 (Вт) 19:15

То есть глаза обманывают тебя, не позволяя видеть, что arr у тебя переменная, а не массив?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 23.02.2010 (Вт) 19:20

делал и массив arr(52) тож самое

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 23.02.2010 (Вт) 21:27

объявил i as byte, в листбокс добавляет все числа по порядку то есть 0.1.2.3.4.5....52, а нужно что б не по порядку(

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

Re: алгоритм "перемешки"

Сообщение Хакер » 23.02.2010 (Вт) 21:34

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

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 23.02.2010 (Вт) 22:49

ясно, ладно...спасибо.

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

Re: алгоритм "перемешки"

Сообщение iGrok » 24.02.2010 (Ср) 1:57

Ну, наверное надо сначала заполнить массив чем-то? Естественно, он ошибку выдавал при попытке что-то сделать с пустым массивом..
label:
cli
jmp label

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 156
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: алгоритм "перемешки"

Сообщение qwertyhp » 24.02.2010 (Ср) 2:00

ListBox имеет свойство "Sorted". Если оно = False, то данные отображаются в порядке их добавления: если оно = True - то данные сортируются. Проверь свойство.
Опа, не посмотрел код: а что именно Вы добавляете в ListBox? Если верить коду - то индексы цикла "For i = 0 To 52" (потому что через строчку у Вас - "List1.AddItem i, i").
А также: у Вас
Код: Выделить всё
Random = Int(Rnd * (max - min)) + min

Но min и max у Вас-то в примере - где? Для Вас
Код: Выделить всё
Random = Int(Rnd * (52))
Пятачок Forever! :)

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

Re: алгоритм "перемешки"

Сообщение alibek » 24.02.2010 (Ср) 9:07

FaKk2 писал(а):забавно что как раз на прошлой неделе нам учитель упоминал код для такого случайного перемешивания.

Не лучший код, особенно для учителя.
Во-первых, в теории достаточно 26 перемешиваний.
Во-вторых, на практике лучше извлекать элементы в произвольном порядке, это позволит быть уверенным в том, что даже теоретически массив всегда будет перемешан.
Lasciate ogni speranza, voi ch'entrate.

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

Re: алгоритм "перемешки"

Сообщение Денис » 24.02.2010 (Ср) 15:11

Аха! Автор топика картишки перетасовать хотел :P Видимо, делает свой покер с блэк-джеком?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 24.02.2010 (Ср) 22:47

да, делаю покер...
qwertyhp, я хочу в листбокс вывести результат перемешивания...никак не получается.

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

Re: алгоритм "перемешки"

Сообщение iGrok » 24.02.2010 (Ср) 23:18

Нуу.. Повторю ещё раз, раз не увидел.
1) Массив надо сначала чем-то заполнить. (Первый проход)
2) Потом массив надо перемешать. (Второй проход)
3) Потом перемешанный массив надо вывести. (Третий проход)

А ты всё пытаешься сделать за один, да ещё и с непроинициализированным массивом..
label:
cli
jmp label

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 24.02.2010 (Ср) 23:22

Код: Выделить всё
Public Sub Swap(a, b)
Dim tmp
tmp = a
a = b
b = tmp
End Sub

Public Sub Mix(Ary() As Long)
Dim LB As Long, UB As Long
Dim i As Long
LB = LBound(Ary)
UB = UBound(Ary)
For i = LB To UB
  Swap Ary(i), Ary(Int(Rnd(1) * (UB - LB + 1) + LB))
Next i
End Sub

Private Sub command1_click()
Const n = 52
  Dim Ary() As Long
  Dim i As Long
  ReDim Ary(0 To n - 1)
  For i = 0 To n - 1
    Ary(i) = i + 1
  Next i
  Randomize Timer
  Mix Ary
  For i = 0 To n - 1
   Text1.Text = Text1.Text & " " & Ary(i)
  Next i
End Sub
Последний раз редактировалось ExiliM 24.02.2010 (Ср) 23:38, всего редактировалось 1 раз.

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

Re: алгоритм "перемешки"

Сообщение iGrok » 24.02.2010 (Ср) 23:37

Это вообще что такое? Ты сам вообще хотя бы понимаешь, что ты написал?
label:
cli
jmp label

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 24.02.2010 (Ср) 23:53

всё, я разобрался...теперь последний вопрос: Как присвоить переменные (a,b,c..) каждому элементу из массива т.е что б было 52 переменных.

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

Re: алгоритм "перемешки"

Сообщение iGrok » 25.02.2010 (Чт) 0:07

"Присвоить переменные элементам массива"?
Никак.

А зачем?
label:
cli
jmp label

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 25.02.2010 (Чт) 0:15

ну как я уже сказал, делаю покер...будет 52 picturebox'a...я хотел что бы например 6 черви это сh6, 10 буби - b10 и т.д и показывать картинки в зависимости от перемешки. то есть допустим первые 3 карты будут 10b,10ch, Kch(король черви) и соответственно картинки должны выложиться на стол. Вообщем все картинки(52) уже изначально будут иметь своё имя. присвоив каждому элементу массива переменную было бы проще, а потом уже "выкладывать карты" которые привязанны к переменным. Если этот способ не правильный, наставьте пожалста, как лучше поступить. Буду очень благодарен...т.к прога горит... :?

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

Re: алгоритм "перемешки"

Сообщение iGrok » 25.02.2010 (Чт) 3:03

Мда... Ну если так..
Загони имена картинок в другой массив, и бери оттуда нужное имя по индексу из первого массива. Хотя это бред тот ещё..

И что значит "прога горит"? Ты это на заказ пишешь, что ли? С таким вот подходом?
Если так - мой тебе совет - откажись, пока не поздно.
label:
cli
jmp label

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 25.02.2010 (Чт) 4:34

ясно, спасибо..нет не на заказ...просто на работе шеф к д.р дал задание. кто лучше сделает тому премия :) т.к я один немного разбираюсь в программировании, у мну есть шанс)

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

Re: алгоритм "перемешки"

Сообщение Денис » 25.02.2010 (Чт) 10:28

ExiliM писал(а):Здраствуйте. Заранее спасибо.


Вот, держи рабочий код по итогам топика. Надеюсь, поможет.

Удачи в гонке, чувак! 8)

Form1.zip
(1.04 Кб) Скачиваний: 66


Загони имена картинок в другой массив, и бери оттуда нужное имя по индексу из первого массива. Хотя это бред тот ещё...


Ага. Я бы сделал так:

Код: Выделить всё
Private Type Card
   cIndex As Integer 'индекс
   cFace As Picture  'изображение
   cName As String   'Имя (например "Двойка бубн")
   cValue As Long    'или Single если надо
   cRules As String  'строка с описанием правил для карты
End Type


а потом бы создал массив Private Cards(52) as Card и загрузил в него картинки карт (кроме всего прочего). Правда, после этого мешать немного иначе придется, чем в моем сорце.

Вот как-то так:
FormB1.zip
(1.22 Кб) Скачиваний: 71


А потом сделал бы всего пять PictureBox'ов и грузил бы в них нужные изображения, согласно игровой логике.

А вот вариант с названиями карт.
FormB2.zip
(1.61 Кб) Скачиваний: 72
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ExiliM
Новичок
Новичок
Аватара пользователя
 
Сообщения: 47
Зарегистрирован: 22.02.2010 (Пн) 4:41

Re: алгоритм "перемешки"

Сообщение ExiliM » 25.02.2010 (Чт) 16:08

ух, спасибо огромное, щас скачаю , разберусь)

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

Re: алгоритм "перемешки"

Сообщение Денис » 25.02.2010 (Чт) 16:53

Аха, разбирайся. А я уже картинки со стандартными изображениями карт прикрутил. Еще чуть-чуть и будет полноценный покер! Но завтра, ибо "рабочий" день окончен. :roll:
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 16

    TopList