码迷,mamicode.com
首页 > 其他好文 > 详细

[CareerCup] 18.2 Shuffle Cards 洗牌

时间:2016-05-03 01:55:01      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

 

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 洗牌

标签:

原文地址:http://www.cnblogs.com/grandyang/p/5453604.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!