Java 无法使用洗牌方法

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

以下是问题描述:

“shuffle方法通过在卡对象数组中一次循环一个位置,并将该位置的卡与位于0到51之间的随机位置(由随机数确定)的卡交换(参见array讲座的幻灯片62-63)来洗牌卡对象数组。”

我已经编写了下面的代码来执行上述操作,但它并没有洗牌我的卡对象

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