思路
牌有1-13个数字,4种花色,还有2张大小王。洗牌过程,最终就是要实现54张牌的随机排序的结果。
所以,我想到了:先要初始化,构造出一副牌的数组,然后调用随机数的函数,将54个元素进行随机排序,这里要用到多个数组,构造出一副牌后,然后依次从中拿一张牌,随机放入到另外一个数组容器中,随机插入采用的是Random类中nextInt()方法,其取值范围为已经放入数组的元素个数加1,最后返回这个数组的结果。
代码1
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 模拟一副54张牌的洗牌过程
* @author chenlibao
*
*/
public class CardShuffle {
public List shuffle() {
// 初始化
List colors = new ArrayList();
List cards = new ArrayList();
List results = new ArrayList();
Random random = new Random();
// X,Y分别代表了小王、大王
cards.add("X");
cards.add("Y");
// a,b,c,d分别代表了红桃、方片,黑桃,梅花
colors.add("a");
colors.add("b");
colors.add("c");
colors.add("d");
// 构造54张牌的数组,包含花色和数字
for (int i=1; i<14; i++) {
for (int j=0; j<colors.size(); j++) {
cards.add(colors.get(j)+Integer.toString(i));
}
}
// 依次从54牌中取牌,将其放入到另外一个数组容器中,每次放入的位置,通过Random类中nextInt()的方法放入,
// 随机数的取值范围为被放数组的大小,根据数组大小,随机的将新元素往里插入。
for (int i=0; i<54; i++) {
Object card = cards.get(i);
int s = results.size() + 1;
int index = random.nextInt(s);
results.add(index, card);
}
return results;
}
public static void main(String[] args) {
CardShuffle t = new CardShuffle();
System.out.println(t.shuffle());
System.out.println(t.shuffle().size());
}
}
代码2(写的好看些)
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Random;
/**
* 模拟一副54张牌的洗牌过程
* @author chenlibao
*
*/
public class CardShuffle02 {
// 初始化
List colors = new ArrayList();
List numbers = new ArrayList();
List cards = new ArrayList();
List results = new ArrayList();
Random random = new Random();
// getCards()构造了一副54张牌的List,含有牌面数、花色、大小王
public List getCards() {
colors.add("红桃");
colors.add("黑桃");
colors.add("方片");
colors.add("梅花");
numbers.add("A");
for (int i=2; i<11; i++) {
numbers.add(Integer.toString(i));
}
numbers.add("J");
numbers.add("Q");
numbers.add("K");
cards.add("小王");
cards.add("大王");
for (int i=0; i<13; i++) {
for (int j=0; j<4; j++) {
String col = (String)colors.get(j);
String num = (String)numbers.get(i);
String card = col + num;
cards.add(card);
}
}
return cards;
}
// 依次从54牌中取牌,将其放入到另外一个数组容器中,每次放入的位置,通过Random类中nextInt()的方法放入,
// 随机数的取值范围为被放数组的大小,根据数组大小,随机的将新元素往里插入。
public List shuffle(List cards) {
for (int i=0; i<54; i++) {
String card = (String)cards.get(i);
int s = results.size() + 1;
int random_Index = random.nextInt(s);
results.add(random_Index, card);
}
return results;
}
public static void main(String[] args) {
CardShuffle02 cs = new CardShuffle02();
List cards = cs.getCards();
List results = cs.shuffle(cards);
System.out.println(results);
System.out.println("\n");
//o 用HashSet来测试是否有重复的牌
System.out.println("########### 将List的值复制给HashSet,测试是否存在重复的结果 ###########\n");
HashSet hs = new HashSet();
for (int i=0; i<results.size(); i++) {
hs.add(results.get(i));
}
if (hs.size() == results.size()) {
System.out.println("结果是否有重复的牌: 没有");
System.out.println("牌数量: "+results.size());
} else {
System.out.println("结果是否有重复的牌: 有");
System.out.println("重复的牌数量为: "+(results.size()-hs.size()));
}
}
}
结果
[红桃6, 方片9, 黑桃K, 黑桃6, 红桃A, 大王, 梅花3, 红桃7, 方片8, 方片6, 黑桃9, 方片10, 梅花5, 黑桃2, 梅花2, 方片Q, 黑桃J, 红桃3, 黑桃7, 梅花9, 红桃10, 红桃8, 黑桃10, 梅花Q, 小王, 梅花4, 方片3, 黑桃8, 红桃2, 梅花7, 方片K, 方片A, 方片4, 黑桃5, 黑桃4, 梅花6, 黑桃Q, 黑桃A, 梅花K, 红桃4, 方片7, 梅花8, 红桃9, 黑桃3, 红桃K, 方片5, 红桃Q, 梅花J, 方片2, 红桃5, 红桃J, 方片J, 梅花10, 梅花A]
########### 将List的值复制给HashSet,测试是否存在重复的结果 ###########
结果是否有重复的牌: 没有
牌数量: 54