Может ли кто-нибудь сказать мне, что здесь происходит неправильно? Я попадаю в бесконечный цикл.
do{
System.out.print("cards["+pickRandom+"] is:"+cards[pickRandom]);
pickRandom = (int)(Math.random() * 52); //pick a new random card
System.out.print(" so now cards["+pickRandom+"] is:"+cards[pickRandom]);
if (cards[pickRandom] != 0) { //if it not 0, then assign it
System.out.print("cards["+pickRandom+"] is not 0: "+cards[pickRandom]);
shuffled[k]=cards[pickRandom];
System.out.print(" shuffled["+k+"]:"+shuffled[k]);
cards[pickRandom]=0;
//System.out.println("For card "+k+ ": "+ shuffled[k] +" was found on pick number "+count);
}
else{System.out.println("cards["+ pickRandom+ " was:" +cards[pickRandom]);}
}while (cards[pickRandom]==0);
Я пытаюсь выбрать случайную карту, которая не является == 0. Если это == 0, я хочу, чтобы цикл выбирал другую карту
Гарантируется, что ваш блок if изменит любые cards[pickRandom]
которые отличны от нуля до 0. И это будет означать, что ваше условие всегда верно.
По сути, это ваша логика кода:
int x = 1;
do {
x = // some random value
if (x != 0) {
x = 0;
}
while (x == 0);
Решение: не делайте этого. Используйте другой способ, чтобы закончить цикл. Для получения более подробной информации, пожалуйста, объясните свой код и его цели более подробно.
Возможное решение вашей проблемы: установите значение массива в ноль после цикла while:
do {
pickRandom = (int) (Math.random() * 52);
if (cards[pickRandom] != 0) {
shuffled[k] = cards[pickRandom];
// cards[pickRandom] = 0; // *** don't do this here ***
} else {
// not sure what you want here
}
} while (cards[pickRandom] != 0);
cards[pickRandom] = 0; // **** do it here! ****
Причина в том, что в этот момент вы узнаете, что выбрана правильная карта. Одна проблема - рассмотрите тестирование, чтобы убедиться, что все значения в карточках не равны 0.
Лучшее решение: используйте ArrayList из целых чисел, перетасуйте их с помощью Collections.shuffle()
, а затем просто удалите 0-й элемент из цикла каждый раз, если size()> 0.
Вы устанавливаете свои cards[pickRandom]
0
в каждом case-
cards[cards[pickRandom]=0;
И после этого вы проверяете условие во время цикла -
while (cards[pickRandom]==0);
Таким образом, в условии while цикл всегда оценивается как true
и поэтому цикл продолжается навсегда без остановки.
cards[pickRandom]=0;
чтобы после цикла do-while