我知道,我知道 - 这里有成百上千的人在询问如何在Java中使用shuffle和数组52卡片对象,我认为这很简单。我没有使用过集合(基于堆栈的建议)。我试过Fisher-Yates洗牌,但我看到的看起来真的很奇怪......有人可以帮忙吗?
我根据这个答案建立了解决方案:Random shuffling of an array
对于数字而言,它的效果很好。这个Class有两个数组,一个包含从0到51的数字,另一个包含52个Card对象,各种实例变量如suit和number。
此代码完美无缺:
public void shuffleNums()
{
Random rnd = new Random();
for (int i = this.numbers.length -1; i > 0; i--)
{
int index = rnd.nextInt(i + 1);
// Simple swap
int temp = this.numbers[index];
this.numbers[index] = this.numbers[i];
this.numbers[i] = temp;
}
}
但是当我尝试在52个Card对象的套牌上使用相同的方法时,就像这样:
public void shuffleCards()
{
Random rnd = new Random();
for (int i = this.cards.length - 1; i > 0; i--)
{
int index = rnd.nextInt(i + 1);
// Simple swap
Card temp = this.cards[index];
this.cards[index] = this.cards[i];
this.cards[i] = temp;
}
}
它不太好用。大多数卡都被成功洗牌,但显然我已经掉了一半,因为现在阵列有大约16个NULL值,只有大约36张随机卡。 NULL似乎随机分布在整个数组中。
我可以轻松解决这个问题,但我想了解为什么会这样。任何人都可以帮我解决发生的事情吗?
编辑: 关于我如何初始化数组 - 我已经检查过该数组确实有2个俱乐部列出的52个Card对象,直到Ace的黑桃。在执行shuffle()之前,数组正确包含52个卡对象。之后它大概包含36个 - 给予或接受。
答案 0 :(得分:1)
初始化卡片可能会出现问题。
如果你这样做
int[] cards = new int[52];
int数组内的所有内容都将设置为0,这意味着您可以对其执行操作
但是,如果你这样做
Card[] cards = new Card[52];
这些都设置为null,因此如果要对其中一个卡执行操作,则会出现空指针异常。这可以解释为什么您获得所有这些空值。