Java模拟一副54张牌的洗牌过程_ArrayList学习

本文介绍了一种实现54张扑克牌随机排序的洗牌算法,通过构造牌组并利用Random类的nextInt()方法进行随机插入,确保每张牌在数组中的位置随机且不重复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路
牌有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值