我们都玩过扑克牌的小游戏,有没有想过扑克牌的发牌是怎样实现的呢?
首先,我们手里有一副牌,假设去掉大小鬼,我们手里的牌用数字1-52表示。我们每次只取出一个数字,那我们如何取出这些数字并且使每次取出的数字不重复?
其实很简单。我们用一个数组存这52个数。利用随机数取出一个数(随机数的范围为1-52),然后将该数与数组最后一个数交换位置,然后再次利用随机数取数,不过值得注意的是此时随机数的范围要减1(范围为1-51),然后将取出的数与位置倒数第二的数交换位置,依次类推......
发牌算法就可以如此实现,时间复杂度为O(n)。
代码实现:
package com.yc.card;
import java.util.Random;
public class Card {
public static void main(String[] args) {
int[] card = getCard(1);//获取一副牌
int len = card.length;
Random random = new Random();
for(int i=0; i<52; i++) {
int index = random.nextInt(len);
String str = showCard(card[index]);
System.out.println(card[index] + "\t" + str);
//进行交换
int temp = card[index];
card[index] = card[len-1];
card[len-1] = temp;
len--;
}
}
/**
* 根据需要获取牌的数量,num为牌的数量
* @param num
* @return
*/
private static int[] getCard(int num) {
int[] x = new int[52*num];
for(int i=0; i
x[i] = i+1;
}
return x;
}
/**
* 根据牌的索引获知得到的什么花色的什么大小的牌
* @param cardIndex
* @return
*/
private static String showCard(int cardIndex) {
String[] hua = new String[]{"方块", "梅花", "红桃", "黑桃"};
String[] num = new String[]{"A", "2", "3","4","5","6","7","8","9","10","J","Q","K"};
//花色索引
int huaindex = (cardIndex-1)/13%4;
//数字索引
int numindex = (cardIndex-1)%13;
return hua[huaindex] + num[numindex];
}
}