zoukankan      html  css  js  c++  java
  • [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 题目汇总

  • 相关阅读:
    HDU 折线分割平面
    HDU 统计问题
    HDU Common Subsequence
    HDU Tiling_easy version
    当网站上线时记得设置umbDebug为false致Umbraco开发者
    写给准大学生的10点建议
    在Orchard中使用Image Gallery模块
    服务器端Javascript
    Web开发杂谈
    浅谈手机开发
  • 原文地址:https://www.cnblogs.com/grandyang/p/5453604.html
Copyright © 2011-2022 走看看