HOWTO · Java
Java でカードのデッキをシャッフルする
この記事では、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 メソッドを使用して、順序付きリストをコンソールに出力します。
ここで、Collections の shuffle 関数を呼び出します。このメソッドは順列を実行し、指定されたリストの値をランダムに計算します。この関数は、ランダムに選択された要素をリストにダンプします。提供されたリストが集合演算をサポートしていない場合、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]