我知道有很多方法可以为这类问题编写代码,但我试图理解我教授的方式。他写了一个方法,它取一个数组中一个整数的值,并为它赋予数组中另一个随机整数的值,即"改组卡片":
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))
答案 0 :(得分:2)
您最好的选择是询问您的教授,但请注意,如果cardNum
可以一直到51
(最后一个索引),那么这一行:
int randomCardNum = cardNum+(int)(Math.random()*(DECK_SIZE-cardNum));
...保证在最后一次迭代中51
导致randomCardNum
,因为DECK_SIZE-cardNum
将为1
,因此乘以{{1}将为您提供小于Math.random()
的值,因此将该值转换为1
将导致int
,当然0
为cardNum+0
。
由于cardnum
和cardNum
在最后一次迭代中都是randomCardNum
,并且在与自己交换卡片方面毫无意义,因此他提前停止了一次迭代。
我的问题应该是:为什么使用51
而不是DECK_SIZE
,因为它会引入可能的维护错误(更改deck.length
的大小但不会记得要改变常数。)
答案 1 :(得分:0)
你教授的代码是正确的。看随机电话:
int randomCardNum = cardNum+(int)(Math.random()*(DECK_SIZE-cardNum));
当cardNum从0开始时,它选择52张牌中的一张,将该随机值放在位置0。下一次循环时,它选择剩下的51张中的一张然后将其放下。然后它选择剩下的50个中的一个并将其放在下一个等等。最后一次通过循环剩下两张牌,它选择一个作为第一个,然后我们完成。你将另一个迭代添加到循环中它只选择剩下的一张卡中的一张,并将它放在已经存在的位置,无论如何都没有效果。