[CareerCup] 18.2 Shuffle Cards 洗牌

 

18.2 Write a method to shuffle a deck of cards. It must be a perfect shuffle—in other words, each of the 52! permutations of the deck has to be equally likely. Assume that you are given a random number generator which is perfect.

 

这道题让我们实现一个洗牌的算法,实际上洗牌的原理非常简单,就是每张牌跟一个随机位置的牌互换位置即可,那么这里就有两种实现方法,递归和迭代。我们先来看递归的方法,具体来说用的是回溯的思想,我们从i=51开始,然后每次进入递归函数,到i=0时返回,然后到了i=1,然后跟[0,i]之间的随机一张牌交换位置,然后一层一层的回来,一直回到i=51,这样每张牌我们都随机交换过位置,从而达到了洗牌的目的:

 

解法一:

void shuffle(vector<int> &cards, int i) {
    if (i == 0) return;
    shuffle(cards, i - 1);
    int k = rand() % (i + 1);
    swap(cards[k], cards[i]);
}

 

我们也可以用迭代的方法来实现,用一个for循环来将每张牌和随机位置的牌交换位置即可:

 

解法二:

void shuffle(vector<int> &cards) {
    for (int i = 0; i < cards.size(); ++i) {
        int k = rand() % (i + 1);
        swap(cards[k], cards[i]);
    }
}

 

CareerCup All in One 题目汇总

你可能感兴趣的:([CareerCup] 18.2 Shuffle Cards 洗牌)