随机数实现扑克牌洗牌 | Java随笔记
相关文章
Java随笔记:Java随笔记
最近刷leetCood有点着魔了,突然想写一个扑克牌洗牌的实现方式。
大脑中第一印象就是用随机数来实现:
建立一个集合来存放随机生成的数
新随机出来的数如果该集合有,则丢弃,反之则加进去。
随机数范围为1-54
先看下代码:
//实现方式一 使用随机数 随机生成54个在1-54范围内的数字,当这些数字不重复时,完成洗牌 public static void ShuffleTheDeck() { System.out.println("开始时间:" + new Date()); List reslutList = new ArrayList(); //开始随机洗牌 Random random = new Random(); while (true) { int endRand = random.nextInt(54); reslutList.add(endRand+1); if (ifRepeat(reslutList) == false) { reslutList.remove(reslutList.size() - 1); } if (reslutList.size() >= 54) { break; } } System.out.println("结束时间:" + new Date()); for (int j = 0; j < reslutList.size(); j++) { System.out.println(reslutList.get(j).toString()); } } //该方法是判断集合中是否有重复元素的,如果有返回false,反之返回true public static boolean ifRepeat(List list) { HashSet set = new HashSet<>(list); Boolean bool = set.size() == list.size() ? true : false; return bool; }复制代码
执行结果:
勉强算是可以吧?
但是,我们实际的扑克牌是啥?
1-10 J Q K 大王 小王
一共15种
除大小王单个以外,其他的都是四个,并且分别是,红桃、黑桃、方块、梅花。
如何优化呢?
这里先加个实体类来存储每次生成的扑克牌吧。
class poker { public poker(String color, String num) { super(); this.color = color; this.num = num; } String color; String num; public String toString() { return color+num; } }复制代码
先写生成,然后再洗牌。
区别就是定义好花色和牌面。
public static void buildPoker(){ //生成52张扑克牌 String[] colors = {"黑桃","方块","梅花","红桃"}; String[] nums = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; LinkedList pokers = new LinkedList(); for(int i=0;i < colors.length;i++) { for(int j=0;j<nums.length;j++) { pokers.add(new poker(colors[i],nums[j])); } } pokers.add(new poker("小王","黑")); pokers.add(new poker("大王","红")); }复制代码
到这里整幅扑克牌已经生成好了,下面就是如何将其随机打乱。
洗牌:还是使用随机数来控制!
public static void buildPoker(){ //生成52张扑克牌 String[] colors = {"黑桃","方块","梅花","红桃"}; String[] nums = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; LinkedList pokers = new LinkedList(); for(int i=0;i < colors.length;i++) { for(int j=0;j<nums.length;j++) { pokers.add(new poker(colors[i],nums[j])); } } pokers.add(new poker("小王","黑")); pokers.add(new poker("大王","红")); //洗牌 LinkedList shuffledpokers = new LinkedList(); while(shuffledpokers.size()<pokers.size()) { Random x = new Random(); poker poke = (poker) pokers.get(x.nextInt(pokers.size())); if(!shuffledpokers.contains(poke)) { shuffledpokers.add(poke); } } System.out.println("洗牌前:"+pokers); System.out.println("洗牌后:"+shuffledpokers); }复制代码
执行结果:
可以做到洗牌啦!
个人所想,虽然很捞,但是也算个思路吧。
如有不对,敬请指出。
作者:大鱼丶
链接:https://juejin.cn/post/7033030218340270111