Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемешать массив 
:(
    Опции темы
User008
Дата 19.2.2011, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: нет
Всего: 1



Нужно случайно перемешать массив, чтобы расстояние между одинаковыми элементами было не меньше данного.
PM MAIL   Вверх
Earnest
Дата 19.2.2011, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



"случайно перемешать" и "чтобы расстояние между одинаковыми элементами было не меньше данного" - несколько не одно и то же. Особенно, если неизвестно, где одинаковые элементы находятся в начале.
Случайно перемешать просто: использовать генератор случайных чисел как способ получить индексы элементов, которые нужно переставить. Повторить неоднократно. Для C++ в STL есть функция random_shuffle.


--------------------
...
PM   Вверх
User008
Дата 19.2.2011, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: нет
Всего: 1



Цитата(Earnest @ 19.2.2011,  13:33)
"случайно перемешать" и "чтобы расстояние между одинаковыми элементами было не меньше данного" - несколько не одно и то же. Особенно, если неизвестно, где одинаковые элементы находятся в начале.
Случайно перемешать просто: использовать генератор случайных чисел как способ получить индексы элементов, которые нужно переставить. Повторить неоднократно. Для C++ в STL есть функция random_shuffle.

Я имею в виду, что расстояние должно быть, например, не меньше 2.
тогда результат 1 2 3 1 2 3 подходит, а 1 2 3 3 2 1 - не подходит
PM MAIL   Вверх
_Y_
Дата 19.2.2011, 14:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Если тупо, то так:
Случайным образом перемешиваем массив как сказано в посте Earnest.
Проверяем расстояния. Если маленькие - корректируем. Самый тупой, но и простой метод коррекции - перемешиваем опять и так мешаем пока не получим желанное. 



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
миг
Дата 19.2.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



Цитата(User008 @  19.2.2011,  13:40 Найти цитируемый пост)
тогда результат 1 2 3 1 2 3 подходит, а 1 2 3 3 2 1 - не подходит

Допустим есть массив в котором n-ое количество ячеек.
1). выбираешь из случайной ячейки первого массива число.
2). копируешь его в другой массив. Еще нужно реализовать условие проверки свободна ли ячейка второго массива.. чтобы не затереть уже имеющиеся данные.
3). в первом массиве ищешь похожие числа и копируешь их во второй массив, чтобы было расстояние равное двум.(когда все отладишь нужно будет добавить реализацию случайного выбора расстояния между числами) Подсчитываешь количество скопированных чисел.
4). затираешь все скопированные числа в первом массиве. например сдвиганием элементов  к началу массива.
5). определяешь "новый" размер массива.. т.е. n-ое количество ячеек минус количество скопированных элементов. тут же проверяешь условие выхода из цикла.
6). Опять ищешь случайную ячейку в первом массиве.
7). Смотри шаг 2.



Это сообщение отредактировал(а) миг - 19.2.2011, 15:05
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
_Y_
Дата 19.2.2011, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



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

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

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

Кстати, массив я бы перемешивал так:

1. Каждому элементу временно присвоил бы случайное вешественное число.
2. Расставил элемены по возрастанию этих чисел.

Дело в том, что случайно выбрасывая целочисленные значения неизбежно сталкиваешься с ограничениями.

Это сообщение отредактировал(а) _Y_ - 19.2.2011, 18:43


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1121 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.