【发布时间】:2015-03-16 04:47:03
【问题描述】:
我知道,我知道 - 这里有数百人询问如何在 Java 中洗牌和排列 52 个卡片对象,我认为这很简单。我没有使用过集合(基于堆栈上的建议)。我已经尝试过 Fisher-Yates 洗牌,但我看到了看起来很奇怪的行为......有人可以帮忙吗?
我的解决方案基于这个答案:Random shuffling of an array
而且效果很好……对于数字。该类有两个数组,一个包含从 0 到 51 的数字,另一个包含 52 个 Card 对象,其中包含各种实例变量,例如花色和数字。
这段代码完美无缺:
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 似乎随机分布在整个数组中。
我可以轻松解决这个问题,但我想了解为什么会这样。谁能帮我弄清楚这是怎么回事?
编辑: 关于我如何初始化数组 - 我已经检查过该数组确实有 52 个 Card 对象,从 2 个梅花到黑桃 A。在执行 shuffle() 之前,数组正确包含 52 个卡片对象。之后它包含大约 36 个 - 给予或接受。
【问题讨论】:
-
由于您的代码是相同的,看起来可能不同的是
cards数组的初始状态。你能发布初始化这个数组的Card值的代码吗? -
(4-1) * (13-1)恰好是 36...你能在那个代码中有一个错误吗? -
恐怕这不是初始化的事情,我也担心它不是始终如一地剩余 36 张卡。 :-( 恐怕我无法向您展示我用来初始化数组的代码,因为我已经编辑了它,而且我的 uni 要我使用的 IDE 没有任何直接的源代码控制集成。(我知道! ) 但是,它基本上创建了 52 个新卡片对象并循环遍历数字 1 到 13,并根据数字是在 13 的第一个块还是第二个等来使用花色。
-
好吧,就像我说的,您发布的内容没有显示任何可能的错误。尝试创建一个可以运行的简短示例来演示问题,然后发布它。如果你成功地证明了问题,这里的人可能会找到原因。如果您的示例没有说明问题......那么您已经编写了一个正确代码示例以在您的程序中使用。双赢。还是您最后的评论意味着您已经修复了它?
-
好吧,我尝试重新创建它,但我做不到。现在它似乎起作用了。很抱歉浪费了大家的时间。 :(
标签: java arrays random shuffle poker