随机播放甲板

时间:2014-12-15 17:02:09

标签: java arrays

我知道有很多方法可以为这类问题编写代码,但我试图理解我教授的方式。他写了一个方法,它取一个数组中一个整数的值,并为它赋予数组中另一个随机整数的值,即"改组卡片":

static void shuffle(int[ ] deck) {
//Randomize the order of the elements of deck
//Pick a random card to go in position 0, then position 1, etc.
for(int cardNum=0; cardNum<DECK_SIZE-1; cardNum++){
  //pick a random value randomCardNum from cardNum...DECK_SIZE-1
  int randomCardNum = cardNum+(int)(Math.random()*(DECK_SIZE-cardNum));
  //Swap card and randomCard
  .....

我无法理解为什么他会for循环到DECK_SIZE - 1为止。有52张牌,我知道阵列的最后一个索引是n-1,但是最后一个cardNum已经不包含了,所以它从0到50。我试过服用-1出来了,无论哪种方式都可以获得52张随机卡片。

我不确定它是否与int randomCardNum有关,但这似乎正确,因为在特定范围内随机化数字的等式是:

Min +(int)(Math.random()+(Max-Min))

2 个答案:

答案 0 :(得分:2)

您最好的选择是询问您的教授,但请注意,如果cardNum可以一直到51(最后一个索引),那么这一行:

int randomCardNum = cardNum+(int)(Math.random()*(DECK_SIZE-cardNum));

...保证在最后一次迭代中51导致randomCardNum,因为DECK_SIZE-cardNum将为1,因此乘以{{1}将为您提供小于Math.random()的值,因此将该值转换为1将导致int,当然0cardNum+0

由于cardnumcardNum在最后一次迭代中都是randomCardNum,并且在与自己交换卡片方面毫无意义,因此他提前停止了一次迭代。


我的问题应该是:为什么使用51而不是DECK_SIZE,因为它会引入可能的维护错误(更改deck.length的大小但不会记得要改变常数。)

答案 1 :(得分:0)

你教授的代码是正确的。看随机电话:

int randomCardNum = cardNum+(int)(Math.random()*(DECK_SIZE-cardNum));

当cardNum从0开始时,它选择52张牌中的一张,将该随机值放在位置0。下一次循环时,它选择剩下的51张中的一张然后将其放下。然后它选择剩下的50个中的一个并将其放在下一个等等。最后一次通过循环剩下两张牌,它选择一个作为第一个,然后我们完成。你将另一个迭代添加到循环中它只选择剩下的一张卡中的一张,并将它放在已经存在的位置,无论如何都没有效果。