无法获得卡洗牌方法

时间:2014-02-18 03:21:18

标签: java shuffle

以下是问题描述:

  

“随机播放方法通过一次一个位置循环插入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。我会根据请求发布控制台输出。

2 个答案:

答案 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;
    }
}