[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]); } }