`

java随机算法(随机洗牌)

    博客分类:
  • Java
阅读更多

 

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]

 

分享到:
评论

相关推荐

    Java随机字符串生成器,可用于生成随机密码,密约等场景,支持字符范围配置(如只允许数字,只允许字母,只允许数字字母,特殊字符等混合配置)

    Java随机字符串生成器,可用于生成随机密码,加密算法密约(AES,RSA等)等场景,支持可选字符范围... 带洗牌算法功能,即在生成随机字符串之前,可以先将源字符范围进行随机洗牌,大大增强最终产生的字符串的随机性。

    javascript随机之洗牌算法深入分析

    洗牌算法是我们常见的随机问题,在玩游戏、随机排序时经常会碰到。它可以抽象成这样:得到一个M以内的所有自然数的随机顺序数组。 在百度搜“洗牌算法”,第一个结果是《百度文库-洗牌算法》,扫了一下里面的内容,...

    基于JAVA的随机键盘

    应用洗牌算法生成随机序列,制作一个键位随机的输入键盘

    python洗牌算法.md

    洗牌算法 洗牌算法的核心思想是从最后一个元素开始,随机选择一个索引,然后交换当前元素和随机选择的元素。这个过程从最后一个元素一直持续到第一个元素。

    慕课网Java扑克牌大作业

    实现的功能:一副扑克牌(去掉大、小王),随机洗牌后,从上到下,顺序地发给四名玩家,每人发四张,比较四个人手中最大的那张牌的大小,谁的牌大,谁是赢家。13张牌在比大小的时候遵循挖坑的规则。(从小到大依次是...

    algorithms:java的一些算法实现

    : 洗牌算法,即把一个列表随机打乱。 : 列表旋转和移动。 : B树,支持CURD操作。 : 红黑树操作。 :跳表。 :树堆。 : 从一个文件中随机抽出k行 : 包括无限循环小数转化 : 求全排列的第K个数或者给定全排列求其顺序

    Java中打乱一个数组的2种公平算法分享

    主要介绍了Java中打乱一个数组的2种公平算法分享,本文讲解了洗牌程序原理、生成随机索引交换二种方法并给出示例代码,需要的朋友可以参考下

    第二次___Lv3_java编程_

    一副牌有54张牌。写出3个洗牌算法。输出洗牌结果。1. 中间分开,2摞牌交叉洗。3次。2. 最后一张牌与他前面53张牌中随机一张交换位置。

    拱猪游戏代码

    洗牌和发牌模拟 首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下: 红桃按照从小到大依次为:1-13 方块按照从小到大依次为:14-26 黑桃按照从小到大依次为:27-39 梅花按照从小到大依次为:40-52 ...

    hashexperiments:哈希实验

    hashexperiments - 如果您以前从未进行过洗牌,您如何洗牌? 或者,“什么是实现 shuffle 的最疯狂的方法……它确实有效!” shuffle 算法的标准方法是 Knuth shuffle,但是当向我提出问题时,我从未听说过它并想出...

    C++大学教程,一本适合初学者的入门教材(part2)

    16. 6 范例:高效的洗牌和发牌模拟程序 16.7 位运算符 16.8 位段 16.9 字符处理库 16.10 字符串转换函数 16.11 字符串处理库中的查找函数 16.12 字符串处理库中的内存函数 16.13 字符串处理库中的其他函数 小...

    C++大学教程,一本适合初学者的入门教材(part1)

    16. 6 范例:高效的洗牌和发牌模拟程序 16.7 位运算符 16.8 位段 16.9 字符处理库 16.10 字符串转换函数 16.11 字符串处理库中的查找函数 16.12 字符串处理库中的内存函数 16.13 字符串处理库中的其他函数 小...

    C++大学教程

    1.9 Java、Internet与万维网--------------------------------------------7 1.10 其它高级语言------------------------------------------------------8 1.11 结构化编程-----------------------------------...

Global site tag (gtag.js) - Google Analytics