За основу я взял давно известный алгоритм, но для увеличения степени “случайности” возникновения чисел, ввел несколько изменений. Допустим, у нас есть колода из 36 карт. Для её хранения мы используем массив из 36 элементов, каждый из которых может принимать значения от 0 до 35. Перетасовка выполняется следующим образом. Мы последовательно перебираем все ячейки массива с картами. Для каждой ячейки мы генерируем случайное число (newPos) в диапазоне от 0 до 35. Это число является новым положением карты в массиве. Т. е. мы меняем местами текущую карту с картой, которая лежит в ячейке с индексом newPos. Теперь обратите внимание на строки начиная с if(i%(length/4) == 0) {. Этот блок кода будет выполняться четыре раза в течение работы метода. Принцип работы следующий. В первую очередь мы получаем случайное число в диапазоне от 0 до 20. Почему выбран именно этот диапазон, я объясню чуть позже. Это число задает время, на которое программа приостанавливает свою работу. Остановка программы выполняем с помощью метода sleep().
После этого, мы опять устанавливаем текущее время в качестве нового базового значения для генератора случайных чисел. Теперь разберемся, что все это нам дает. В первую очередь увеличивается время выполнения перетасовки. Это, конечно, не очень хорошо, но давайте подумаем. Максимально возможная задержка составляет 80 мс. Данный алгоритм предназначен для использования в карточных играх, в которых, при перетасовке карт, игроку обычно показывают какую-нибудь анимацию (это увеличивает реалистичность игры). Длительность такой анимации обычно около секунды или больше (игрок должен хоть что-то рассмотреть:-)). Т. е., за время этой анимации, можно будет раз десять перетасовать колоду.
А теперь посмотрим на сильные стороны этого алгоритма. Мы четыре раза устанавливаем новое базовое число. Предсказать значение этого числа практически невозможно, и не только потому, что длительность паузы мы выбираем случайным образом. Любая современная операционная система вносит дополнительный эффект случайности в работу алгоритма. Дело в том, что в системе выполняется одновременно несколько десятков процессов (программ). Но один процессор (не многоядерный) может выполнять одновременно только одну программу. Поэтому для создания эффекта многозадачности используется специальная программа – планировщик, которая переключает процессы.
Сначала выполняется несколько команд из одной программы, потом – несколько из другой, и так далее. Порядок переключения программ зависит от многих причин. Это и приоритеты процессов, и тактовая частота процессора, и версия операционной системы, и многое другое. Таким образом, существует высокая вероятность того, что выполнение нашего метода перетасовки будет прервано планировщиком (и не один раз). Системное время, естественно, не зависит от порядка работы нашей программы, и значения, которые возвращает метод getTime() предсказать практически невозможно. А именно этого мы и добиваемся. Для тестирования работы алгоритма я написал небольшую программу. В неё входят 3 файла с исходными кодами. Reshuffler. java – имеет один статический метод, который и выполняет перетасовку карт.
CardsPack. java – этот файл, содержит класс, который используется для создания колоды карт. Он содержит два метода: getPackOfCards() – возвращает массив с номерами карт; toString() – возвращает строку с названиями карт в колоде. Оба эти метода находятся в пакете cards. tools. Main. java – содержит класс с функцией main, которая выполняет следующие операции:
- создает новую колоду; выводит её содержимое; перетасовывает колоду; и опять выводит её содержимое.
Теперь посмотрим результаты работы программы:
Начальное расположение карт в колоде | Расположение карт после сортировки |
шестерка пик семерка пик восьмерка пик девятка пик десятка пик валет пик дама пик король пик туз пик шестерка треф семерка треф восьмерка треф девятка треф десятка треф валет треф дама треф король треф туз треф шестерка бубен семерка бубен восьмерка бубен девятка бубен десятка бубен валет бубен дама бубен король бубен туз бубен шестерка червей семерка червей восьмерка червей девятка червей десятка червей валет червей дама червей король червей туз червей | король пик десятка червей король червей восьмерка червей девятка треф валет червей восьмерка треф десятка пик шестерка треф семерка треф шестерка бубен король бубен туз треф валет пик туз бубен девятка пик король треф валет бубен восьмерка пик дама пик дама треф девятка червей семерка бубен туз червей десятка треф семерка червей шестерка червей десятка бубен дама бубен восьмерка бубен девятка бубен туз пик шестерка пик семерка пик дама червей валет треф |
Как видите, у нас все получилось. Скачать исходный код проекта: cards_reshuffler_src. zip (2,6 кБ). Скачать программу:cards_reshuffler_prog. zip (2,3 кБ). Желаю успехов. Постовой центр озонотерапии клиническая психотерапия