【项目2:洗牌】 在扑克牌游戏中,每次游戏开始都要求把54张牌重新排列一下,称为洗牌。试编写程序将一副扑克牌(用54个整数1~54表示)随机洗好后,顺序输出54张牌的情况。 参考界面:
参考解答(共4种,可作为程序阅读,品味用STL解决问题的方法,必要时,请查找相关手册) 解法1:初始化一个 vector,顺序加入所有牌,即整数1~54。然后从容器中随机抽取一个加到另一个vector中,这个过程一共执行54次。
#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 <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 <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 <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; } 相关资源:c 实现的简易洗牌程序