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

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战


相关文章

Java随笔记:Java随笔记


  • 最近刷leetCood有点着魔了,突然想写一个扑克牌洗牌的实现方式。
  • 大脑中第一印象就是用随机数来实现:
+ 随机数范围为1-54
+ 建立一个集合来存放随机生成的数
+ 新随机出来的数如果该集合有,则丢弃,反之则加进去。
  • 先看下代码:
+ 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
csharp复制代码//实现方式一  使用随机数 随机生成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](https://gitee.com/songjianzaina/juejin_p6/raw/master/img/e20b1510f7206dc8ce77b450e03266bc14bf6bdcded70b9659a21dd226b2a18b) + 勉强算是可以吧?
  • 但是,我们实际的扑克牌是啥?
+ 1-10 J Q K 大王 小王
+ 一共15种
+ 除大小王单个以外,其他的都是四个,并且分别是,红桃、黑桃、方块、梅花。
+ 如何优化呢?
  • 这里先加个实体类来存储每次生成的扑克牌吧。

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    typescript复制代码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;
      }

    }
  • 先写生成,然后再洗牌。

  • 区别就是定义好花色和牌面。

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ini复制代码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

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

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

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    ini复制代码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

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%