「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
相关文章
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); }
-
执行结果:
- 可以做到洗牌啦!
- 个人所想,虽然很捞,但是也算个思路吧。
- 如有不对,敬请指出。
路漫漫其修远兮,吾必将上下求索~
如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah
今天的文章随机数实现扑克牌洗牌 | Java随笔记分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/17895.html