Java 无法使用洗牌方法
以下是问题描述: “shuffle方法通过在卡对象数组中一次循环一个位置,并将该位置的卡与位于0到51之间的随机位置(由随机数确定)的卡交换(参见array讲座的幻灯片62-63)来洗牌卡对象数组。” 我已经编写了下面的代码来执行上述操作,但它并没有洗牌我的卡对象Java 无法使用洗牌方法,java,shuffle,Java,Shuffle,以下是问题描述: “shuffle方法通过在卡对象数组中一次循环一个位置,并将该位置的卡与位于0到51之间的随机位置(由随机数确定)的卡交换(参见array讲座的幻灯片62-63)来洗牌卡对象数组。” 我已经编写了下面的代码来执行上述操作,但它并没有洗牌我的卡对象 public void shuffle() { //reset nextCard to 0. nextCard = 0; Random randomGen = new Random(); Card t
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().
public void shuffle()
{
//将nextCard重置为0。
nextCard=0;
Random randomGen=新的Random();
卡片-临时卡片;
int randomNum=randomGen.nextInt(甲板尺寸);
int i;
对于(i=0;i您应该为for
循环的每次迭代生成randomNum
像这样重写循环将得到预期的结果
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.
intrandomnum;
int i;
对于(i=0;i来说,@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;
}
}
publicstaticvoidshuffle(int[]a)
{
int N=a.长度;
对于(int i=0;i
您应该在循环内生成randomNum
,如果它与i
随机音符相同,则尝试再次生成它-这可能不是均匀分布的。请看一看-这是一个众所周知的算法,看起来与此类似(当然有一些显著差异).非常感谢。@Dukelingtank you也@Karthik Kalyanasundaran我欠你的债,它成功了!很好。很好。我用了他的答案,所以他应该得到答案,但这是正确的,我听说过Knuth shuffle,但不知道如何实现它,谢谢你给我看这个。+1