![]() |
|
![]() ![]() ![]() |
|
User008 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 306 Регистрация: 9.9.2009 Репутация: нет Всего: 1 |
Нужно случайно перемешать массив, чтобы расстояние между одинаковыми элементами было не меньше данного.
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
"случайно перемешать" и "чтобы расстояние между одинаковыми элементами было не меньше данного" - несколько не одно и то же. Особенно, если неизвестно, где одинаковые элементы находятся в начале.
Случайно перемешать просто: использовать генератор случайных чисел как способ получить индексы элементов, которые нужно переставить. Повторить неоднократно. Для C++ в STL есть функция random_shuffle. -------------------- ... |
|||
|
||||
User008 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 306 Регистрация: 9.9.2009 Репутация: нет Всего: 1 |
Я имею в виду, что расстояние должно быть, например, не меньше 2. тогда результат 1 2 3 1 2 3 подходит, а 1 2 3 3 2 1 - не подходит |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Если тупо, то так:
Случайным образом перемешиваем массив как сказано в посте Earnest. Проверяем расстояния. Если маленькие - корректируем. Самый тупой, но и простой метод коррекции - перемешиваем опять и так мешаем пока не получим желанное. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
миг |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 15.9.2008 Репутация: нет Всего: 1 |
Допустим есть массив в котором n-ое количество ячеек. 1). выбираешь из случайной ячейки первого массива число. 2). копируешь его в другой массив. Еще нужно реализовать условие проверки свободна ли ячейка второго массива.. чтобы не затереть уже имеющиеся данные. 3). в первом массиве ищешь похожие числа и копируешь их во второй массив, чтобы было расстояние равное двум.(когда все отладишь нужно будет добавить реализацию случайного выбора расстояния между числами) Подсчитываешь количество скопированных чисел. 4). затираешь все скопированные числа в первом массиве. например сдвиганием элементов к началу массива. 5). определяешь "новый" размер массива.. т.е. n-ое количество ячеек минус количество скопированных элементов. тут же проверяешь условие выхода из цикла. 6). Опять ищешь случайную ячейку в первом массиве. 7). Смотри шаг 2. Это сообщение отредактировал(а) миг - 19.2.2011, 15:05 --------------------
Oaks may fall when reeds stand the storm. |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
миг, в таком алгоритме есть проблема. После нескольких шагов может сложится ситуация, при которой в целевом массиве нет достаточного числа разрешенных мест для одинаковых членов, перемещаемых в ходе иттерации.
Кроме того, некий орган чувствует сомнение в качестве такой рандомизации. Ведь на каждую последующую иттерацию накладывается все больше ограничений со стороны предыдуших иттераций. Кажется мне что качественно случайна может быть только расстановка элементов в массиве без ограничений на их позиционирование. Кстати, массив я бы перемешивал так: 1. Каждому элементу временно присвоил бы случайное вешественное число. 2. Расставил элемены по возрастанию этих чисел. Дело в том, что случайно выбрасывая целочисленные значения неизбежно сталкиваешься с ограничениями. Это сообщение отредактировал(а) _Y_ - 19.2.2011, 18:43 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |