ФорумПрограммированиеБольше языковJava → Алгоритм перемешивания (елементов/значений массива) - в добрые руки)

Алгоритм перемешивания (елементов/значений массива) - в добрые руки)

  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 31 декабря 2009 г. 16:24

    Вообщем, недавно столкнулся с задачкой одной, в котором необходимо перемешать рандомно елементы в массиве.
    Я нигде не нашел(или плохо искал) методов, которые либо были бы уже предопределены в АПИ по 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   ));

           }


    Алгоритм - прост до невозможности.
    Меня, вообще заинтересовала данная тема. Если у кого есть подобные мысли, иные реализации алгоритма в самом эффективном/оптимальном пути - пожалуйста, делитесь.

    Спустя 173 сек.
    Stack - такой класс уже существует в JDK, в курсе. Просто не знал до этого. Имя для примера/класса-образца влетело буквально рандомно в голову, ничего не подозревая).
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 31 декабря 2009 г. 19:27, спустя 3 часа 2 минуты 15 секунд

    В пизду!
    Всех с Новым годом!
    все умрут, а я изумруд
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 1 января 2010 г. 22:04, спустя 1 день 2 часа 37 минут

    прикольный рассказ =))))))))))))
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 2 января 2010 г. 10:20, спустя 12 часов 15 минут 57 секунд

    блоги на пиху.ру

    а так хуйня, я уверен на 100% что есть готовое решение и я 100% УВЕРЕН ЧТО ОНО ЕСТЬ!

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

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 2 января 2010 г. 13:12, спустя 2 часа 52 минуты 7 секунд

    phpdude, Чувак, отчасти согласен. Но, в принципе, с 2й стороны - даже интересно покопаться в этом всем…
    Никогда, дуд, не замечал? - Чем сложнее язык, чем сложнее в нем разобраться, чем больше нужно разгребать тонны навоза в нем, копаться в доках…короче говоря - чем больше с ним ебешься и убиваешь себе нервы - тем больше платят за работу на нем….
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 2 января 2010 г. 13:46, спустя 33 минуты 33 секунды


    phpdude, Чувак, отчасти согласен. Но, в принципе, с 2й стороны - даже интересно покопаться в этом всем…
    Никогда, дуд, не замечал? - Чем сложнее язык, чем сложнее в нем разобраться, чем больше нужно разгребать тонны навоза в нем, копаться в доках…короче говоря - чем больше с ним ебешься и убиваешь себе нервы - тем больше платят за работу на нем….

    хз. ты опять на пхп наезжаешь?)
    Сапожник без сапог
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 января 2010 г. 15:58, спустя 2 часа 11 минут 53 секунды

    Дело не в языке.
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 2 января 2010 г. 20:12, спустя 4 часа 13 минут 46 секунд

    phpdude, ну та не, с чего бы то… о джаве я…и си, и асп, и в том роде….)
    Хотя если наезжать на пхп с той стороны что он самый простой - то все же да). Ты наверное не сам создавал неконтролируемый поток матов из себя когда он изза своей нетипизированости, багов и прочего выводил тебя не раз из себя….)
  • Ewg777

    Сообщения: 510 Репутация: N Группа: Джедаи

    Spritz 2 января 2010 г. 20:12, спустя 55 секунд


    phpdude, ну та не, с чего бы то… о джаве я…и си, и асп, и в том роде….)
    Хотя если наезжать на пхп с той стороны что он самый простой - то все же да). Ты наверное не сам создавал неконтролируемый поток матов из себя когда он изза своей нетипизированости, багов и прочего выводил тебя не раз из себя….)

    Это решается написание тестов и грамотной системой ошибок.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 2 января 2010 г. 20:24, спустя 11 минут 50 секунд



    phpdude, ну та не, с чего бы то… о джаве я…и си, и асп, и в том роде….)
    Хотя если наезжать на пхп с той стороны что он самый простой - то все же да). Ты наверное не сам создавал неконтролируемый поток матов из себя когда он изза своей нетипизированости, багов и прочего выводил тебя не раз из себя….)

    Это решается написание тестов и грамотной системой ошибок.
    как и с любым другим языком.
    Сапожник без сапог
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 2 января 2010 г. 21:55, спустя 1 час 30 минут 46 секунд


    phpdude, ну та не, с чего бы то… о джаве я…и си, и асп, и в том роде….)
    Хотя если наезжать на пхп с той стороны что он самый простой - то все же да). Ты наверное не сам создавал неконтролируемый поток матов из себя когда он изза своей нетипизированости, багов и прочего выводил тебя не раз из себя….)



    Дело не в языке. А в том как ты на него смотришь и как его используешь.
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 16 мая 2010 г. 19:08, спустя 133 дня 20 часов 12 минут

    Я нигде не нашел(или плохо искал) методов, которые либо были бы уже предопределены в АПИ по JDK, либо - что еще похлеще, - были бы заданы в какомто интерфейсе (типа Collection)


    Collections.shuffle(List list) - не то?
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 16 мая 2010 г. 21:47, спустя 2 часа 39 минут 21 секунду

    Тимур на форуме Оо
    все умрут, а я изумруд
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 16 мая 2010 г. 21:48, спустя 33 секунды

    так выпьем же за это
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 16 мая 2010 г. 23:55, спустя 2 часа 7 минут 42 секунды

    Да, Тимур вернулся, аллилуйя!
    https://smappi.org/ - платформа по созданию API на все случаи жизни

Пожалуйста, авторизуйтесь, чтобы написать комментарий!