利用ArrayList进行的洗牌算法

算法思想

  1. 先构造一副扑克牌;
  2. 利用for循环从后往前依次取牌 i;
  3. 从[0,i]用Random函数随机取一张扑克牌j;
  4. 将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]

猜你喜欢

转载自blog.csdn.net/qq_43452252/article/details/104434680