public class Card { public static final int DIAMOND = 0; // 方块(钻石) public final static int CLUB = 1; // 梅花 public static final int HEART = 2; // 红桃(红心) public static final int SPADE = 3; // 黑桃(花锄) public static final int JOKER = 4; // 王 public final static int THREE = 0; public final static int FOUR = 1; public final static int FIVE = 2; public final static int SIX = 3; public final static int SEVEN = 4; public final static int EIGHT = 5; public final static int NINE = 6; public final static int TEN = 7; public final static int JACK = 8;// J public final static int QUEEN = 9;// Q public final static int KING = 10;// K public final static int ACE = 11;// A public final static int DEUCE = 12; // 2 public final static int BLACK = 13; // 小王 public final static int COLOR = 14;// 大王 /** 花色 0代表方块, 1代表梅花, 2代表红桃, 3代表黑桃,4:王 */ private int suit; /** 点数 规定: 0代表3, 1代表4, 2代表5,... */ private int rank; public Card() { } public Card(int suit, int rank) { // this.rank = rank; // this.suit = suit; setRank(rank); setSuit(suit); } public int getSuit() { return suit; } public void setSuit(int suit) { if (suit < DIAMOND || suit > JOKER) throw new RuntimeException("花色超过范围!"); this.suit = suit; } public int getRank() { return rank; } public void setRank(int rank) { if (rank < THREE || rank > COLOR) { throw new RuntimeException("点数超过范围!"); } this.rank = rank; } private static final String[] RANK_NAMES = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2", "小王", "大王" }; private static final String[] SUIT_NAMES = { "方块", "梅花", "红桃", "黑桃", "" }; // 覆盖Object 类的toStirng() 方法. 实现对象的文本描述 public String toString() { return SUIT_NAMES[suit] + RANK_NAMES[rank]; } public boolean equals(Object obj) { if (obj == null) { return false; } if (this == obj) { return true; } if (obj instanceof Card) { Card other = (Card) obj; return this.rank == other.rank && this.suit == other.suit; } return false; } public int hashCode() { // return suit*100+rank; // suit=3= 00000000 00000000 00000000 00000011 // rank=10=00000000 00000000 00000000 00000011 // suit<<16=00000000 00000011 00000000 00000000 // 00000000 00000011 00000000 00000011 return (suit << 16) + rank;// (x<<16)+y } }
import java.util.ArrayList; import java.util.List; import java.util.Random; import org.junit.Test; public class ShuffleCard { public static void swap(List<?> list, int i, int j) { final List l = list; l.set(i, l.set(j, l.get(i))); } //随机洗牌 @Test public void testShuffle2() { List<Card> cards = new ArrayList<Card>(); // 生成一副牌 for (int rank = Card.THREE; rank <= Card.DEUCE; rank++) { cards.add(new Card(Card.DIAMOND, rank)); cards.add(new Card(Card.CLUB, rank)); cards.add(new Card(Card.HEART, rank)); cards.add(new Card(Card.SPADE, rank)); } cards.add(new Card(Card.JOKER, Card.BLACK)); cards.add(new Card(Card.JOKER, Card.COLOR)); System.out.println(cards.toString()); Random random = new Random(); for (int i = cards.size(); i > 1; i--) { int m = random.nextInt(i); swap(cards, i - 1, m); } System.out.println(cards.toString()); } }
生成结果:
[方块3, 梅花3, 红桃3, 黑桃3, 方块4, 梅花4, 红桃4, 黑桃4, 方块5, 梅花5, 红桃5, 黑桃5, 方块6, 梅花6, 红桃6, 黑桃6, 方块7, 梅花7, 红桃7, 黑桃7, 方块8, 梅花8, 红桃8, 黑桃8, 方块9, 梅花9, 红桃9, 黑桃9, 方块10, 梅花10, 红桃10, 黑桃10, 方块J, 梅花J, 红桃J, 黑桃J, 方块Q, 梅花Q, 红桃Q, 黑桃Q, 方块K, 梅花K, 红桃K, 黑桃K, 方块A, 梅花A, 红桃A, 黑桃A, 方块2, 梅花2, 红桃2, 黑桃2, 小王, 大王]
[红桃8, 方块5, 梅花2, 方块4, 小王, 梅花5, 黑桃2, 方块Q, 黑桃A, 黑桃J, 红桃K, 梅花4, 方块J, 梅花A, 黑桃5, 方块3, 红桃9, 红桃Q, 黑桃K, 方块7, 梅花Q, 梅花6, 红桃J, 方块9, 方块6, 方块8, 黑桃Q, 梅花K, 梅花9, 方块K, 红桃5, 红桃3, 黑桃8, 方块10, 大王, 红桃2, 梅花10, 黑桃10, 黑桃3, 黑桃6, 红桃4, 黑桃9, 红桃6, 梅花8, 梅花7, 红桃10, 黑桃7, 方块A, 黑桃4, 梅花J, 红桃A, 梅花3, 方块2, 红桃7]
相关推荐
在程序设计中,洗牌算法通常用来随机化一组元素的顺序,使得每次运行程序时都能得到不同的结果,这对于游戏开发、随机抽样等场景非常有用。 #### 二、关键概念与技术点 1. **数组(Array)与列表(List)** - **数组...
3. **优化洗牌算法**:虽然Collections.shuffle()已经足够随机,但也可以通过自定义随机数生成器或者Fisher-Yates(Knuth)洗牌算法来进一步理解洗牌过程。 4. **优化发牌算法**:考虑特殊情况,如玩家数量变化或...
Java中的洗牌通常通过 Fisher-Yates(也称为 Knuth)洗牌算法 实现。该算法通过遍历数组并随机交换当前元素与未遍历元素之一的位置来达到打乱顺序的目的。`java.util.Random`类可以用来生成随机索引。 - 首先,创建...
在Java编程语言中,"洗牌"是一种常见的算法,它常用于模拟扑克牌游戏或者其他需要随机排列元素的场景。这个过程通常涉及到数组或集合的随机排序。在这个问题中,我们关注的是如何使用`java.util.Random`类来实现这一...
洗牌的核心在于随机性,Java提供了`java.util.Random`类来生成随机数。我们可以使用它的`nextInt()`方法来得到一个范围内的随机整数,以此来随机地选取并交换牌的位置,模拟洗牌过程。 3. **对象封装**: 为了更...
洗牌算法是编程领域中一个有趣的议题,常用于模拟各种随机事件,比如电子游戏中抽取卡片、抽奖系统等。本文将探讨三种不同的洗牌算法思路,它们各有优缺点,适用于不同的场景。 首先,我们来理解洗牌算法的核心目标...
### 随机数生成与洗牌算法 #### 一、随机数生成 **定义**:随机数是指在一定范围内,各个数值出现的概率相同且无法预测的数字。 **特性**: 1. **不可预测性**:任何算法都无法事先确定生成的具体数值。 2. **...
在这个小程序中,我们将探讨如何生成牌,随机洗牌,以及公平地发牌给三个玩家。 【描述】:“牌的生成、随机洗牌、发牌、输出显示” 1. **牌的生成**:在Java中,首先我们需要创建一个表示扑克牌的数据结构。这...
在我们的示例代码中,我们使用了 Java 的 Random 类来生成随机数,并使用了一个循环来实现随机洗牌算法。具体来说,我们首先初始化一个数组,然后使用循环将每个元素与一个随机索引对应的元素进行交换。最后,我们...
在这个Java编程任务中,我们需要创建一个模拟人工洗牌的程序,然后将52张牌平均分发给四个玩家,即东西南北。以下是实现这个程序的关键知识点: 1. **类和对象**:首先,我们需要定义一个名为`Card`的类来表示扑克...
Java随机字符串生成器,可用于生成随机密码,加密算法密约(AES,RSA等)等场景,支持可选字符范围... 带洗牌算法功能,即在生成随机字符串之前,可以先将源字符范围进行随机洗牌,大大增强最终产生的字符串的随机性。
- `Collections.shuffle()`是Java提供的洗牌工具方法,可以快速随机化集合中的元素顺序。 3. **发牌逻辑**: - `dealHand`方法实现了发牌功能,通过截取列表的最后n个元素作为玩家的手牌。 4. **输出格式**: -...
在Java编程语言中,洗牌、发牌以及随机地主的实现是常见的游戏逻辑操作,它们涉及到随机数生成、数组操作以及数据结构的运用。在这个话题中,我们将深入探讨如何在Java中有效地实现这些功能。 首先,让我们从“洗牌...
一种实现方式是使用Fisher-Yates洗牌算法(又称Knuth shuffle),先将奖品编号进行洗牌,然后再抽取顶部的一个元素,这样可以实现不均匀的概率分布。 在实际编程中,`Lottery`文件可能包含了实现这些功能的Java类。...
通过循环遍历整个牌堆,每次选择一个随机位置的牌与当前遍历到的牌进行交换,从而达到洗牌的效果。这种方法称为Fisher-Yates洗牌算法,是一种常用的高效洗牌算法。 #### 发牌逻辑 `dealCard()`方法负责发牌,通过...
在洗牌时,可以将HashMap中的所有牌添加到TreeSet中,由于TreeSet会自动排序,这样就实现了随机打乱牌的效果。然后,再按顺序遍历TreeSet,分发给各个玩家,达到洗牌的目的。 斗地主游戏的基本规则是三人对战,每人...
在Java编程中,创建、洗牌、分组和排序扑克牌是一种常见的算法实践,它可以用于理解和掌握数据结构、集合操作以及随机数生成等基础知识。在这个场景中,我们通常会使用集合框架来实现扑克牌的逻辑,例如ArrayList...
洗牌算法,又称为随机排列生成,是编程中处理随机性问题的一个常见场景,常用于游戏中的随机事件、随机选择等。它的目标是将一个有序序列(如1到M的整数)随机重排,形成一个看似无规律的新序列。 在描述的算法中,...
洗牌算法(Shuffle Algorithm)是一种常见的算法,主要用于随机地重新排列一组数据的顺序。在实际应用中,它经常被用于游戏开发、模拟实验以及各种需要随机化处理的场景。 #### 二、核心思想 洗牌算法的核心思想是...
Java的`Random`类可以帮助我们生成不重复的随机序号,以确保每张牌在洗牌后都有可能出现。 4. **面向对象编程**:在Java中,你可以创建一个`Deck`类来管理牌堆,包含洗牌、发牌等方法。同时,可以创建一个`Player`...