范型程序设计——洗牌

来源:互联网 发布:苹果预约软件 编辑:程序博客网 时间:2024/06/16 23:42

在扑克牌游戏中,每次游戏开始都要求把54张牌重新排列一下,称为洗牌。试编写程序将一副扑克牌(用54个整数1~54表示)随机洗好后,顺序输出54张牌的情况。

参考界面:


4种方法来品味如何用STL解决问题:

解法1:初始化一个 vector,顺序加入所有牌,即整数1~54。然后从容器中随机抽取一个加到另一个vector中,这个过程一共执行54次。

#include "stdafx.h"#include <ctime>#include <vector>#include <list>#include <iostream>#include <iterator>#include <cstdlib>using namespace std;using namespace std;typedef vector<int> IntVector;typedef unsigned int VIndex;void vectorShuffle(IntVector &unshuffled, IntVector &shuffled){VIndex p, size = unshuffled.size();while (size){p = rand() % size--;shuffled.push_back(unshuffled[p]);unshuffled.erase(unshuffled.begin() + p);}}int main(){ostream_iterator<int> os(cout, " ");srand(time(NULL));IntVector c, sc;for (VIndex i = 1; i <= 54; i++){c.push_back(i);}cout << "Before Shuffle" << endl;copy(c.begin(), c.end(), os);cout << endl;vectorShuffle(c, sc);cout << "\nAfter Shuffled" << endl;copy(sc.begin(), sc.end(), os);cout << endl << endl;return 0;}
解法2:相同思路,用list

#include "stdafx.h"#include <ctime>#include <vector>#include <list>#include <iostream>#include <iterator>#include <cstdlib>using namespace std;typedef list<int> IntList;typedef unsigned int VIndex;void listShuffle(IntList &unshuffled, IntList &shuffled){VIndex  p, size = unshuffled.size();IntList::iterator iter;while (size){p = rand() % size--;iter = unshuffled.begin();while (p != 0){iter++;p--;}shuffled.push_back(*iter);unshuffled.erase(iter);}}int main(){ostream_iterator<int> os(cout, " ");srand(time(NULL));IntList cl, scl;for (VIndex i = 1; i <= 54; i++){cl.push_back(i);}cout << "Before Shuffle" << endl;copy(cl.begin(), cl.end(), os);cout << endl;listShuffle(cl, scl);cout << "\nAfter Shuffled" << endl;copy(scl.begin(), scl.end(), os);cout << endl << endl;return 0;}
解法3:随机交换两个位置的元素来洗牌。函数中time是要执行交换的次数,如果是54张牌的话,交换次数大于27的话就已经表现出很随机的排列了。

#include "stdafx.h"#include <ctime>#include <vector>#include <iterator>#include <algorithm>#include <iostream>using namespace std;typedef vector<int> IntVector;void SwapShuffle(IntVector &datas, int time){unsigned size = datas.size(), p1, p2;while (time--){p1 = rand() % size;p2 = rand() % size;swap(datas[p1], datas[p2]);}}int main(){ostream_iterator <int>  os(cout, " ");srand(time(NULL));vector <int> poker;for (int i = 1; i <= 54; i++){poker.push_back(i);}cout << "Before Shuffle" << endl;copy(poker.begin(), poker.end(), os);cout << endl;SwapShuffle(poker, 100);cout << "\nAfter Shuffled" << endl;copy(poker.begin(), poker.end(), os);cout << endl << endl;return 0;}
解法4:采用STL的 random_shuffle 算法

#include "stdafx.h"#include <ctime>#include <vector>#include <iterator>#include <algorithm>#include <iostream>using namespace std;int main(){ostream_iterator <int>  os(cout, " ");srand(time(NULL));  // 洗牌前要先初始化随机数种子vector <int> poker;for (int i = 1; i <= 54; i++){poker.push_back(i);}cout << "Before Shuffle" << endl;copy(poker.begin(), poker.end(), os);cout << endl;random_shuffle(poker.begin(), poker.end());cout << "\nAfter Shuffled" << endl;copy(poker.begin(), poker.end(), os);cout << endl << endl;return 0;}



0 0