算法思想
- 先构造一副扑克牌;
- 利用for循环从后往前依次取牌 i;
- 从[0,i]用Random函数随机取一张扑克牌j;
- 将i与j位置上的牌进行交换。
Java代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class card{
private String suit;
private int rank;
card(String suit,int rank){
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
String num = String.format("%d",rank);
switch(rank){
case 11:
num = "J";
break;
case 12:
num = "Q";
break;
case 13:
num = "K";
break;
}
return suit + ":" + num;
}
}
class cardDeam{
//构造一副扑克牌
String color[] = {"♥","♠","♣","♦"};
public List<card> poker(){
List<card> cards = new ArrayList<>();
for(int i = 0;i < 4;i++){
for(int j = 1;j <= 13;j++){
card card = new card(color[i],j);
cards.add(card);
}
}
return cards;
}
//洗牌算法
public void shufleCards(List<card> cards){
//从后往前依次取牌i
for(int i = cards.size() - 1;i > 0;i--){
//设置随机种子,一般获取系统当前时间
Random a = new Random(20191226);
//从[0,i)随机取一张扑克牌j
int j = a.nextInt(i);
//将i和j位置上的牌进行交换
swap(cards,i,j);
}
}
//交换两张扑克牌的位置
private void swap(List<card> cards,int i,int j){
card temp = cards.get(i);
cards.set(i,cards.get(j));
cards.set(j,temp);
}
}
public class Test20191226 {
public static void main(String[] args) {
cardDeam newcard = new cardDeam();
List<card> cards = newcard.poker();
System.out.println(cards);
newcard.shufleCards(cards);
System.out.println(cards);
}
}
运行结果
洗牌前:
[♥:1, ♥:2, ♥:3, ♥:4, ♥:5, ♥:6, ♥:7, ♥:8, ♥:9, ♥:10, ♥:J, ♥:Q, ♥:K,
♠:1, ♠:2, ♠:3, ♠:4, ♠:5, ♠:6, ♠:7, ♠:8, ♠:9, ♠:10, ♠:J, ♠:Q, ♠:K,
♣:1, ♣:2, ♣:3, ♣:4, ♣:5, ♣:6, ♣:7, ♣:8, ♣:9, ♣:10, ♣:J, ♣:Q, ♣:K,
♦:1, ♦:2, ♦:3, ♦:4, ♦:5, ♦:6, ♦:7, ♦:8, ♦:9, ♦:10, ♦:J, ♦:Q, ♦:K]
洗牌后:
[♥:10, ♠:1, ♠:5, ♠:2, ♥:Q, ♣:7, ♥:K, ♥:9, ♠:J, ♣:4, ♥:7, ♥:6, ♥:5,
♦:J, ♠:9, ♣:Q, ♦:3, ♦:K, ♠:8, ♥:8, ♦:5, ♦:4, ♦:1, ♥:4, ♠:K, ♣:10,
♦:9, ♣:5, ♠:Q, ♠:6, ♣:8, ♣:2, ♠:3, ♣:J, ♥:1, ♣:6, ♦:2, ♥:2, ♦:8,
♣:3, ♦:6, ♠:7, ♥:J, ♠:10, ♦:7, ♦:10, ♣:1, ♥:3, ♦:Q, ♣:K, ♠:4, ♣:9]