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 が作成されます。デッキサイズがゼロ値より大きくなければならないという条件で、while ループを適用します。

この状態を維持するためのアイデアは、あるデッキの要素が削除され、別のシャッフルされたリストに配置されるためです。したがって、元のサイズは減少し続け、最終的にゼロになります。

ループ内では、random 関数を使用して最初にインデックスを見つけます。静的メソッドは Math クラスに存在し、クラス名で直接呼び出されます。ユーティリティ関数は、0.0 から 1.0 の範囲の乱数を生成します。このメソッドは常に double 値を返します。

index 値を計算するには、形成された乱数に配列リストの現在のサイズを掛けます。したがって、毎回ランダムなインデックスを生成します。

これで、形成されたインデックスを使用して、元のデッキのインデックスにある要素が削除されます。remove メソッドは ArrayList クラスからのものであり、インデックスの特定の値を削除します。削除されるのは、インデックスまたはリスト内の位置です。

この関数は、リスト内のインデックスにある要素も返します。削除するオブジェクトが新しいシャッフルリストに追加されます。ループが続き、1つの要素が元のデッキのサイズを縮小します。したがって、次に繰り返すときに、新しいインデックスが生成されます。そして毎回、値が削除され、シャッフルされたリストに追加されます。

以下は、指定されたコードブロックの出力です。

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
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