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 類,它刪除索引處的特定值。它需要刪除列表中的索引或位置。
該函式還返回列表中索引處的元素。要刪除的物件被新增到新的隨機列表中。迴圈繼續,其中一個元素現在減小了原始甲板的大小。因此,當它下次迭代時,將生成一個新的索引。並且每次都會刪除一個值並將其附加到混洗列表中。
下面是給定程式碼塊的輸出。
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]