Перемешать данные в массиве

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

Перемешать данные в массиве

Сообщение Osteon » 14.07.2015 (Вт) 19:53

Здравствуйте.
Собственно, в теме и весь вопрос - как перемешать данные в массиве случайным образом? Например, перемешать вопросы в тестировании, или файлы в папке, ну и многое подобное...
У меня нет лучшего решения, чем создать двумерный массив, в первую размерность которого записать данные нужного массива, во вторую - рандомные числа с соответствующей проверкой, чтобы не было совпадений, а затем отсортировать по второй размерности, перенести данные в одномерный массив, уничтожив двумерный. Ну, или не уничтожать двумерный, просто брать данные из первой размерности.
Мне кажется, что алгоритм несколько корявый... :? Есть ли более "красивые" решения?

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

Re: Перемешать данные в массиве

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

Бред какой-то.

Для 50 элементов, которые нужно расположить в случайном порядке, ты предлагаешь иметь двухмерный массив с 2500 элементами?
Красивых решений большое количество. Попробуй подумать получше или хотя бы погуглить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Перемешать данные в массиве

Сообщение ger_kar » 14.07.2015 (Вт) 20:57

А зачем данные вообще перемешивать непосредственно в массиве? Не проще ли, если нужны случайные данные из массива - просто выбирать данные из него по случайному индексу? Используя этот же прием можно и в новый массив данные переопределить.
Бороться и искать, найти и перепрятать

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Перемешать данные в массиве

Сообщение Mikle » 14.07.2015 (Вт) 21:44

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

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Перемешать данные в массиве

Сообщение The trick » 14.07.2015 (Вт) 23:05

Функция получения случайных чисел без повторения от 1 до максимального заданного при инициализации.
Код: Выделить всё
Private Sub Form_Load()
    Dim i       As Long
    Dim max     As Long
   
    ' Максимальное число
    max = 20
   
    ' Инициализация
    NextRnd True, max
   
    ' Получение
    For i = 0 To max - 1
        Debug.Print NextRnd
    Next
   
End Sub

' Для инициализации передаем первым параметром True, вторым максимальное число
Private Function NextRnd(Optional ByVal Reset As Boolean, Optional ByVal i As Long = 1000) As Long
    Static dat() As Long, Idx As Long, Count As Long
   
    If Reset Then Count = i: ReDim dat(Count - 1): Exit Function
    If Count = 0 Then MsgBox "Нет чисел": Exit Function
    Idx = Int(Rnd * Count): NextRnd = dat(Idx): Count = Count - 1
    If NextRnd = 0 Then NextRnd = Idx + 1
    If dat(Count) = 0 Then dat(Idx) = Count + 1 Else dat(Idx) = dat(Count)
End Function
UA6527P

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.07.2015 (Ср) 0:01

Вот несколько алгоритмов перемешивания. Переписать нужный на VB6 не должно стать проблемой.

PS: Ссылка взята отсюда.

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Перемешать данные в массиве

Сообщение Osteon » 15.07.2015 (Ср) 6:11

ger_kar писал(а): Не проще ли, если нужны случайные данные из массива - просто выбирать данные из него по случайному индексу?

Действительно, как-то даже не подумалось - можно рандомизировать цифирЬки, по количеству равных размеру массива, "номиналом" не больше размера массива... Потом по ним делать выборку...

Mikle писал(а):Можно просто несколько раз выбрать случайную пару индексов и поменять элементы местами.

Мне кажется, это несколько сложнее реализовать программно... ИМХО, естественно...

The trick писал(а):Функция получения случайных чисел без повторения от 1 до максимального заданного при инициализации.

Тока я не знаю функцию NextRnd в VB6... :( А от более современных я далек весьма... :cry: Нашел http://www.cyberforum.ru/vba/thread1245137.html что-то похожее. Это та функция?

Qwertiy писал(а):Вот несколько алгоритмов перемешивания. Переписать нужный на VB6 не должно стать проблемой.

Действительно, красивые решения... :)

Спасибо всем большое за наставления!

Отдельное спасибо вежливому, воспитанному, тактичному и педагогичному Хакеру-Телепату за всеобъемлющую и исчерпывающую консультацию любителю VB6, да не изотрутся его нежные пальчики о клавиатуру во веки веков!!!

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Перемешать данные в массиве

Сообщение ger_kar » 15.07.2015 (Ср) 6:57

Osteon писал(а):Тока я не знаю функцию NextRnd в VB6...
NextRnd это не встроенная функция VB6, а функция написанная на VB6, которую написал The trick и привел пример её использования. В том куске кода которые он привел содержится и функция и пример.
Бороться и искать, найти и перепрятать

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Перемешать данные в массиве

Сообщение Osteon » 15.07.2015 (Ср) 19:13

ger_kar писал(а): В том куске кода которые он привел содержится и функция и пример.


От я Тупорылкин!!! Не догадался скролл прокрутить... :oops: :thumbdown:

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Перемешать данные в массиве

Сообщение Osteon » 17.07.2015 (Пт) 17:58

The trick, огромное спасибо за NextRnd! Обалденная штука! Вот только "Debug.Print" ничего не пишет, так же как и "Print". Но когда я начал присваивать значения функции элементам массива, все пошло как по маслу. Это именно то, что мне нужно, свою задачу я решил за 10 минут.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList