范型程序设计——洗牌
来源:互联网 发布:苹果预约软件 编辑:程序博客网 时间: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
- 范型程序设计——洗牌
- 范型程序设计——洗牌
- C++实践参考:洗牌(范型程序设计)
- 《C语言及程序设计》程序阅读——洗牌
- 第15周实践项目-洗牌(范型程序设计)(1)
- 第15周项目-洗牌(范型程序设计)(4)
- PAT程序设计考题——甲级1042(洗牌机) C++实现
- 网易——洗牌
- 程序设计_洗牌程序
- 第十五周项目二-洗牌(范形程序设计)
- 一维数组洗牌——js
- 游戏算法之——洗牌算法
- 第十五周项目2——洗牌
- 每日一练——洗牌
- 第十五周项目2—洗牌
- 第15周项目 2—洗牌
- 第十五周项目2—洗牌
- 洗牌问题——偶数张扑克牌,分成两等份, 洗牌多少次回到原来顺序?
- Android: Sqlite基本操作
- php 模仿百度蜘蛛采取网页信息
- 冒泡排序
- OpenStack Python知识(1):with函数使用
- 不同的路径
- 范型程序设计——洗牌
- Web Service是什么-作者: 阮一峰
- 大、小根堆
- 垃圾收集算法
- Python爬虫第一步之获取网页源代码
- Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
- 概念区分
- SICP 习题2.20 same-parity
- hdoj-1098-Ignatius's puzzle