随机数实现扑克牌洗牌 | Java随笔记

「这是我参与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;
          }
      复制代码
    • 执行结果:
    • 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

  • 可以做到洗牌啦!
  • 个人所想,虽然很捞,但是也算个思路吧。
  • 如有不对,敬请指出。

路漫漫其修远兮,吾必将上下求索~

如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah

猜你喜欢

转载自juejin.im/post/7033030218340270111
今日推荐