阅读 192

随机数实现扑克牌洗牌 | 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;
          }复制代码
    • 执行结果:

    • image-20211121221302561.png

    • 勉强算是可以吧?

  • 但是,我们实际的扑克牌是啥?

    • 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("大王","红"));
    }复制代码
  • image-20211121222236466.png

  • 到这里整幅扑克牌已经生成好了,下面就是如何将其随机打乱。

  • 洗牌:还是使用随机数来控制!

  • 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);
        }复制代码
  • 执行结果:

  • image-20211121222418961.png

  • 可以做到洗牌啦!

  • 个人所想,虽然很捞,但是也算个思路吧。

  • 如有不对,敬请指出。


作者:大鱼丶
链接:https://juejin.cn/post/7033030218340270111

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐