以下是问题描述:
“随机播放方法通过一次一个位置循环插入Card对象数组并随机更换(参见阵列演讲的62-63号幻灯片)卡片在该位置与随机卡片一起洗牌卡对象数组位置(由随机数确定)在0到51之间。“
我已经编写了以下代码来执行上述操作,但它并没有改变我的卡片对象。
public void shuffle()
{
//reset nextCard to 0.
nextCard = 0;
Random randomGen = new Random();
Card tempCard;
int randomNum = randomGen.nextInt(DECK_SIZE);
int i;
for(i=0;i<DECK_SIZE;i++)
{
tempCard = deck[i];
deck[i] = deck[randomNum];
deck[randomNum] = tempCard;
}//end for.
}//end shuffle().
问题是什么?如何解决?
P.S。我会根据请求发布控制台输出。
答案 0 :(得分:4)
您应该为randomNum
循环
for
像这样重写你的循环会给你预期的结果,
int randomNum;
int i;
for(i=0;i<DECK_SIZE;i++)
{
randomNum = randomGen.nextInt(DECK_SIZE);
tempCard = deck[i];
deck[i] = deck[randomNum];
deck[randomNum] = tempCard;
}//end for.
答案 1 :(得分:2)
@Karthik的方法不正确,因为它使用randomGen.nextInt(DECK_SIZE),每次返回一个数字[0..DECK_SIZE-1]。你真正想要的是将DECK [i]与其中一个值[DECK [i + 1] .. DECK [N-1]]交换,这是尚未使用的剩余值之一。这被称为Knuth shuffle。
public static void shuffle(int[] a)
{
int N = a.length;
for (int i = 0; i < N; i++)
{ // Exchange a[i] with random element in a[i..N-1]
int r = i + StdRandom.uniform(N-i);
int temp = a[i];
a[i] = a[r];
a[r] = temp;
}
}