Вообщем, недавно столкнулся с задачкой одной, в котором необходимо перемешать рандомно елементы в массиве.
Я нигде не нашел(или плохо искал) методов, которые либо были бы уже предопределены в АПИ по JDK, либо - что еще похлеще, - были бы заданы в какомто интерфейсе (типа Collection), в которых нужно было бы их описать самому.
По перемешиванию/тасованию элементов есть немало алгоритмов, согласен. Я в принцыпе, признаюсь - искал не так уж много, потому что при поиске результаты предлагали мне алгоритмы на основе математики/алгебры, каких то сложных вычитаний и тому подобное.
Я, откровенно говоря, не любитель программировать, исользуя паттерны, построенные на основе математических формул(знаю, что зря, так как большинство задач без простейших формул - не реализовать). Еще более гнетет то что великого старину Доналда Кнута я так и не прочел. Дело в том что там большинство алгоритмов на математических формулах и основаны(бля, меня колбасит от такого)))...
Короче говоря, решил выложить тут, может кому пригодится - простейший алгоритм тасовки элементов(без всяких алгебраических формул/выебонов), содержащихся в массиве. Если такой вы уже где то использовали/встречали/видели - то так и скажите. Наверное все же гдето он не одну тысячу раз использовал. Я ж не хочу ставать в шеренгу очередных изобретателей колес).
Итак, для осуществления перемешивания элементов(вернее - для получения готового массива с такими элементами)
нам сначала понадобится 2 массива.
1й - основной, в котором элементы будут располагаться в исходном постоянном порядке.
2й же - для хранения тех же элементов, но только в перемешанном виде.
Далее - заполняем 1й массив, чем хотите.
Основными инструментами в алгоритме являются размеры 2-х массивов.
Суть лежит в том, что необходимо в цикле(условием которого является сравнение размеров этих 2-х массивов)
каждую итерацию проверять, не содержится ли уже рандомно полученный элемент(в диапазоне от нуля до размера массива) 1го массива - в нашем втором массиве.
Если не содержится - тогда добавляем во 2й массив. Это, ясень пень - для того чтобы не было дублируищехся значений(если кто не понял).
Ну и....так до того момента пока 2й массив не насобирает то количество значений, которое присуще в 1м массиве.
код:
ArrayList<String>
Stack =
new ArrayList<String>
(14);
ArrayList<String> ShuffledStack =
new ArrayList<String>
(14);
Stack.
add(0,
"a");
Stack.
add(1,
"b");
Stack.
add(2,
"c");
Stack.
add(3,
"d");
Stack.
add(4,
"e");
Stack.
add(5,
"f");
Stack.
add(6,
"e");
Stack.
add(7,
"g");
Stack.
add(8,
"h");
Stack.
add(9,
"j");
Stack.
add(10,
"k");
Stack.
add(11,
"l");
Stack.
add(12,
"o");
Stack.
add(13,
"m");
int size =
Stack.
size();
while(ShuffledStack.
size() != size
)
{
int r =
(int)(Math.
random()*
(size
));
if(!ShuffledStack.
contains( Stack.
get( r
)))
ShuffledStack.
add( Stack.
get( r
));
}
Алгоритм - прост до невозможности.
Меня, вообще заинтересовала данная тема. Если у кого есть подобные мысли, иные реализации алгоритма в самом эффективном/оптимальном пути - пожалуйста, делитесь.
Спустя 2 минуты 53 секунды добавил
Stack - такой класс уже существует в JDK, в курсе. Просто не знал до этого. Имя для примера/класса-образца влетело буквально рандомно в голову, ничего не подозревая).