Java에서 카드 덱 섞기

Rashmi Patidar 2023년10월12일
  1. Java에서 기존 루프를 사용하여 ArrayList 섞기
  2. Java에서 컬렉션 shuffle 기능을 사용하여 ArrayList 섞기
Java에서 카드 덱 섞기

셔플이라는 단어는 문자 그대로 요소, 개체 또는 카드를 무작위 또는 정의되지 않은 순서로 배열하는 것을 의미합니다. 정의된 패턴을 따르지 않는 개체 목록은 섞인 것으로 간주됩니다.

마찬가지로 Java에서는 다양한 방법을 통해 사용자가 요소를 섞을 수 있습니다. 아래는 이 프로세스를 보여주는 코드 블록입니다.

Java에서 기존 루프를 사용하여 ArrayList 섞기

import java.util.ArrayList;

public class Main {
  private static final int SIZE_OF_DECK = 52;

  public static void main(String[] args) {
    ArrayList<Integer> cardsDeck = new ArrayList<>();
    for (int i = 0; i < SIZE_OF_DECK; ++i) {
      cardsDeck.add(i);
    }
    System.out.println("Deck Of Cards:" + cardsDeck);
    ArrayList<Integer> shuffledDeck = new ArrayList<>();
    while (cardsDeck.size() > 0) {
      int index = (int) (Math.random() * cardsDeck.size());
      int removedCard = cardsDeck.remove(index);
      shuffledDeck.add(removedCard);
    }
    System.out.println("Shuffled Cards" + shuffledDeck);
  }
}

위의 코드에서 ArrayList가 인스턴스화됩니다. 생성된 인스턴스는 ArrayList에 요소를 추가하는 데 도움이 됩니다. 목록은 0부터 51 값까지 순차적으로 채워집니다. 데크 크기는 클래스 수준에서 선언된 정적 변수입니다.

for 루프는 초기 값이 정적 데크 크기 변수로 확인되는 조건을 확인합니다. 이제 초기 목록을 섞기 위해 다른 빈 ArrayList가 생성됩니다. 데크 크기가 0 값보다 커야 하는 조건으로 while 루프를 적용합니다.

이 조건을 유지하는 아이디어는 한 데크의 요소가 제거되어 다른 셔플 목록에 배치되기 때문입니다. 따라서 원래 크기는 계속 줄어들고 마침내 0이 됩니다.

루프 내에서 random 함수를 사용하여 인덱스를 먼저 찾습니다. 정적 메서드는 Math 클래스에 있으며 클래스 이름으로 직접 호출됩니다. 유틸리티 기능은 0.01.0 사이의 난수를 생성합니다. 메서드는 항상 double 값을 반환합니다.

index 값을 계산하기 위해 형성된 난수에 배열 목록의 현재 크기를 곱합니다. 따라서 매번 임의의 인덱스를 생성합니다.

이제 형성된 인덱스는 원래 데크의 인덱스에서 요소를 제거하는 데 사용됩니다. remove 메소드는 ArrayList 클래스에 있으며 인덱스에서 특정 값을 제거합니다. 제거할 목록의 인덱스 또는 위치를 사용합니다.

이 함수는 또한 목록의 인덱스에 있는 요소를 반환합니다. 제거할 개체가 새 섞인 목록에 추가됩니다. 하나의 요소가 이제 원래 데크의 크기를 줄이는 루프가 계속됩니다. 따라서 다음에 반복할 때 새 인덱스가 생성됩니다. 그리고 매번 값이 제거되고 셔플된 목록에 추가됩니다.

아래는 주어진 코드 블록의 출력입니다.

Deck Of Cards:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51]
Shuffled Cards[51, 34, 28, 47, 14, 49, 42, 50, 26, 0, 44, 43, 2, 36, 30, 8, 46, 11, 21, 23, 7, 4, 33, 41, 32, 1, 20, 3, 10, 18, 6, 40, 29, 24, 31, 13, 45, 39, 22, 15, 27, 48, 9, 5, 25, 12, 38, 35, 37, 17, 16, 19]

Java에서 컬렉션 shuffle 기능을 사용하여 ArrayList 섞기

다음은 shuffle 방법을 사용한 셔플링을 보여주는 코드 블록입니다.

import java.util.ArrayList;
import java.util.Collections;

public class Main {
  public static void main(String[] args) {
    int deckSize = 52;
    ArrayList<Integer> list = new ArrayList<>();
    for (int i = 0; i < deckSize; ++i) {
      list.add(i);
    }
    System.out.println("Sequential List: " + list);
    Collections.shuffle(list);
    System.out.println("Shuffled List: " + list);
  }
}

코드 블록에서 ArrayList 인스턴스화 절차는 동일합니다. 목록에 요소를 추가하는 것은 첫 번째 코드의 요소와 유사하게 수행됩니다. println 메소드를 사용하여 정렬된 목록을 콘솔에 인쇄합니다.

이제 Collectionsshuffle 기능이 호출됩니다. 이 방법은 순열을 수행하고 주어진 목록의 값을 무작위로 계산합니다. 이 함수는 무작위로 선택된 요소를 목록으로 다시 덤프합니다. 제공된 목록이 설정 작업을 지원하지 않으면 UnsupportedOperationException이 발생합니다. 무작위로 형성된 목록은 원본 목록과 함께 콘솔에 인쇄됩니다.

Sequential List[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51]
Shuffled List[46, 5, 4, 0, 19, 11, 13, 21, 1, 38, 36, 29, 31, 35, 48, 22, 49, 6, 14, 51, 3, 47, 16, 12, 42, 27, 50, 40, 26, 30, 33, 9, 43, 39, 2, 10, 28, 44, 8, 24, 41, 32, 25, 45, 34, 7, 23, 15, 18, 20, 37, 17]
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

관련 문장 - Java ArrayList

관련 문장 - Java Loop

관련 문장 - Java Array