C++实践参考:洗牌
2016-06-22 16:04
316 查看
/* *Copyright(c)2016.烟台大学计算机学院 *All right reserved. *文件名称:test.cpp *作者:黄金婵 *完成日期:2016年6月22日 *版本号:v1.0 * *问题描述:在扑克牌游戏中,每次游戏开始都要求把54张牌重新排列一下,称为洗牌。试编写程序将一副扑克牌(用54个整数1~54表示)随机洗好后,顺序输出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; }
知识点总结:
原数组的第 i 个元素在新数组的前 i 个位置的概率都是:(1/i) * [i/(i+1)] * [(i+1)/(i+2)] *...* [(n-1)/n] = 1/n,(即第i次刚好随机放到了该位置,在后面的n-i 次选择中该数字不被选中)原数组的第 i 个元素在新数组的 i+1 (包括i + 1)以后的位置(假设是第k个位置)的概率是:(1/k) * [k/(k+1)] * [(k+1)/(k+2)] *...* [(n-1)/n] = 1/n(即第k次刚好随机放到了该位置,在后面的n-k次选择中该数字不被选中)
相关文章推荐
- C语言基础知识
- C++之离港篇学习笔记之引用
- c++63个关键字
- 标准C++中的string类的用法总结
- 使用Visual Leak Detector for Visual C++ 捕捉内存泄露
- C++函数重载和内置函数
- 一些C语言期末作业 题目以及自己做的答案。
- C++ 字符串操作常见函数
- 大整数加减运算的C语言实现
- 5.【函数】
- 谷歌开源项目风格指南笔记(上)
- 发送邮件
- c++结构体模板
- C++学习笔记(2) 顺序容器的使用
- C++构造函数与析构函数顺序
- VC++6.0如何创建与调用动态链接库(dll)
- 小飞的电梯调度算法
- c++ 容器的使用 总结
- 循环链表
- CLI/C++中混合类的使用【转】