Java代码在循环时无限重复

Java代码在循环时无限重复,java,Java,我有一些代码,通过从2D数组卡中将随机选择的卡分配到ArrayList卡组,来洗牌一副卡,但当我运行代码时,它会陷入无限循环 它一开始运行得很好,但似乎随机停止工作,代码几乎没有变化 卡是一个13 x 4的阵列,每个位置有不同的卡 ArrayList<String> deck = new ArrayList<String>(); for (int i = 0; i < 52; i++) { int v = 0;

我有一些代码,通过从2D数组
中将随机选择的卡分配到ArrayList
卡组
,来洗牌一副卡,但当我运行代码时,它会陷入无限循环

它一开始运行得很好,但似乎随机停止工作,代码几乎没有变化

是一个13 x 4的阵列,每个位置有不同的卡

ArrayList<String> deck = new ArrayList<String>();
        for (int i = 0; i < 52; i++)  {
            int v = 0;
            int s = 0;
            Boolean notInDeck = false;
            while (!notInDeck) {
                v = rand.nextInt(13);
                s = rand.nextInt(4);
                if (!deck.contains(cards[v][s])) {
                    notInDeck = true;
                    deck.add(cards[v][s]);
                }
            }
        }
编辑: 我意识到问题出在这条线路上

cards[i][j] = value;
应该是

cards[i][j] = value + " " + suit;

你让你的生活更艰难

在现实生活中,在你完成全部52张牌之前,你不会拿无数张牌,也不会随机挑选牌。事实上,你从52张牌开始,然后把它们填满。在这里也一样

  • 创建52张卡片的集合
  • 洗牌该集合(如用集合。洗牌)

  • 虽然这是简单的线性运算,但您的解决方案是不确定的。

    除非您遇到不幸的一天或使用错误的值初始化了cards数组,否则它不应该无限期运行

    所以,事情就是这样。由于您使用随机猜测将一张牌放入牌组中,因此每次尝试后,随机生成器都越来越难找到一张尚未放入牌组的牌。在一天结束时,你将有越来越多的尝试正确放置最后一张牌。这些尝试的数量可能达到数百甚至数千次

    我在您的代码中添加了几行代码,并在上可视化了问题

    ArrayList deck=new ArrayList();
    HashMap guesses=新HashMap();
    对于(int i=0;i<52;i++){
    int guess=0;
    int v=0;
    int s=0;
    布尔notInDeck=false;
    而(!诺丁迪克){
    v=兰特·耐克斯汀(13);
    s=兰特·耐克斯汀(4);
    猜测++;
    如果(!deck.包含(卡片[v][s])){
    notInDeck=正确;
    甲板。添加(卡片[v][s]);
    猜。放(i,guess++);
    }
    }
    }
    for(Map.Entry:guesses.entrySet()){
    System.out.printf(“%2s:%s\n”,entry.getKey(),entry.getValue());
    }
    

    如果您多次执行代码,您将清楚地看到猜测次数在最后显著增加的模式。

    这不是创建混洗组的方式。你需要创建一个完整的牌组,按顺序排列,然后实际洗牌。但是像这样做应该可以很好地工作。我只是想知道为什么它不起作用。加上@luk2302的注释,如果随机整数从未生成特定的数字,那么使用此代码可能永远不会完成洗牌。洗一副牌,相反,您应该在数组中循环,并在随机生成的行和列索引处使用元素交换每个元素。谢谢,我会尝试让您真正利用使用对象的优势,创建一个包含
    Card
    对象的
    Deck
    类,您可以使用
    Deck Deck=新建牌组()
    并使用
    Deck.shuffle()
    进行洗牌。让生活变得更轻松。是的,我可能会这么做。谢谢。我这样做的原因是我不知道如何制作2D ArrayList,但我想这并不重要,因为我不需要将卡片组织成套装和值,也不需要能够引用它们。你不必有2D列表。只是平面52元素我现在意识到了。这是我一开始以为会发生的事情,是的,我确实看到了我的方法的问题,但我确信这不是发生的事情,因为数字的输出持续数分钟,重复数十万次。然后,请提供你的卡片阵列。西装没有分配,因此,无限期执行。更改
    卡[i][j]=值
    卡[i][j]=套装+价值。是的,我注意到了,但之前还不错。我不知道那是怎么回事。谢谢
    
    cards[i][j] = value;
    
    cards[i][j] = value + " " + suit;
    
    ArrayList<String> deck = new ArrayList<String>();
    
    HashMap<Integer, Integer> guesses = new HashMap<>();
    
    for (int i = 0; i < 52; i++) {
      int guess = 0;
    
      int v = 0;
      int s = 0;
      Boolean notInDeck = false;
    
      while (!notInDeck) {
        v = rand.nextInt(13);
        s = rand.nextInt(4);
        guess++;
        if (!deck.contains(cards[v][s])) {
          notInDeck = true;
          deck.add(cards[v][s]);
          guesses.put(i, guess++);
        }
      }
    
    }
    
    for (Map.Entry<Integer, Integer> entry: guesses.entrySet()) {
      System.out.printf("%2s : %s\n", entry.getKey(), entry.getValue());
    }