Java代码在循环时无限重复
我有一些代码,通过从2D数组Java代码在循环时无限重复,java,Java,我有一些代码,通过从2D数组卡中将随机选择的卡分配到ArrayList卡组,来洗牌一副卡,但当我运行代码时,它会陷入无限循环 它一开始运行得很好,但似乎随机停止工作,代码几乎没有变化 卡是一个13 x 4的阵列,每个位置有不同的卡 ArrayList<String> deck = new ArrayList<String>(); for (int i = 0; i < 52; i++) { int v = 0;
卡
中将随机选择的卡分配到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张牌开始,然后把它们填满。在这里也一样
虽然这是简单的线性运算,但您的解决方案是不确定的。除非您遇到不幸的一天或使用错误的值初始化了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());
}