java while循环没有爆发

时间:2013-09-23 20:20:31

标签: java for-loop while-loop infinite-loop

所以我正在写一个程序,有人从牌组中取牌。所以我写了一个while循环,循环并检查是否有超过4个随机创建的卡,如果有,则更换卡。

这是我的代码:

String card = (int)Math.ceil(Math.random() * 13) + " ";
String[] used2 = used.split(" ");
//used is a String like "12 3 7 8 4 ... # etc" such that it is all the previously drawn cards.
boolean checking = true;
boolean isIn = false;
int in = 0;
int check = 0;
while(checking){
    for(int q = 0; q < used2.length; q++){
        check += 1;
        if(card.equals(used2[q] + " ")){
            in += 1;
            if(in == 4){
                System.out.println(check); //debugging line
                check += 1;
                card = (int)Math.ceil(Math.random() * 13) + " ";
                card_val = (int)Math.ceil(Math.random() * 13);
                isIn = true;
                in = 0;
                break;
            }
        }
    }
    if(isIn){
        //will execute if there is 4 of the cards already drawn so the while loop continues with a different card
        checking = true;
    }
    else{
        //breaks out of while loop because the card can be drawn
        checking = false;
    }
}
used += card;

现在这个运行,但是当我把它放在for循环中并将其设置为运行40次时,大约2/3次它会创建一个无限循环。

我发现只有在if(in == 4)语句出现时才会创建无限循环。

这是为什么?自昨晚以来我一直在调试,我无法弄明白。

2 个答案:

答案 0 :(得分:6)

isIn设置为true后,您永远不会将其设置回false。因此,底部的if语句会将checking设置为true,从而导致无限循环。

isIn循环的开头将false设置为while

while(checking){
    isIn = false;  // Add this line.
    for(int q = 0; q < used2.length; q++){

答案 1 :(得分:0)

似乎是一个简单任务的复杂算法。

为什么不改变实现使用简单的减法?最初分配所有52个值的List,然后当你从牌组中“抽出”牌时,将其从列表中删除。

那么您可以使用Math.random() * list.size()来获得适当范围的索引吗?