从n中取出m个不重复的数
来源:互联网 发布:淘宝网页代码怎么上传 编辑:程序博客网 时间:2024/04/30 02:23
辅助函数,randint(i,j)获取[i,j]的一个随机数
int randint(int i , int j){return rand()%(j-i+1)+i;}
方法1:
从n个中取m个,当前这个数被取出的概率为n/m,即if(rand() % n < m)就被取出。
void genKnuth(unsigned int n , unsigned int m){int remain = n;int unselect = m;for (int i = 0;i<n;++i){if (rand()%remain < unselect){std::cout<<i<<std::endl;--unselect;}--remain;}}
剩下remain个数,还有unselect个未取,那么当前这个数被取出的概率为unselect/remain。要说的是从100个取20个数,这个方法必定能取出20个数。如果当前取出的以足20个,那么unselect=0,那么后面的所有数都不会被取。如果未满20个,那么后面的都有一定的概率被取到,极端情况就是前面都没有被取到,那么后面的数被取到的概率会越来越大,直到被取出的概率为1为止。
方法2:
向set中插入不重复的m个数即可。
void genSet(unsigned int n , unsigned int m){std::set<int> s;while(s.size() < m)s.insert(rand() % n);for (int i : s){std::cout<<i<<std::endl;}}
set的特点是如果有了数字t,那么再插入数字t,也只是只有一个数字t。这点和MultiSet不同。不知道的可以学习下STL。
方法3:
把牌洗乱,然后抽出20个即可。
void genShuf(int n , int m){int * x = new int[n];for (int i = 0 ; i < n ; ++i){x[i] = i;}int j;for (int i = 0 ; i < m ; ++i){j = randint(i , n-1);if (i != j){swap(x[i] , x[j]);}}sort(x,x+m);for (int i = 0 ; i < m ;++i){std::cout<<x[i]<<std::endl;}delete []x;}
- 从n中取出m个不重复的数
- [迅雷笔试题]从1....n中随机输出m个不重复的数
- 从1....n中随机输出m个不重复的数
- 从1....n中随机输出m个不重复的数
- 从0到n-1中随机等概率输出m个不重复的数
- 从0到n-1中随机等概率输出m个不重复的数
- php 组合算法(从n个数中取出m个元素进行组合,不考虑排序和元素重复)
- 求从1,2...n中取任意个不重复的数和为m的所有组合
- 下面的程序可以从0....n-1中随机等概率的输出m个不重复的数。(假设n>>m)
- 关于从n个数中随机取出m个
- 从m中取出n个全组合
- 递归方法从m个元素中取出n个元素的算法 ------分析
- 从M个数中随机等可能的取出N个的问题
- 从M个数中随机等可能的取出N个的问题
- 从M个数中随机等可能的取出N个的问题
- Java实现从m个各不相同的元素中取出n个,并进行全排列。
- Java实现从m个各不相同的元素中取出n个,并进行全排列
- 随机从数组中取出指定的不重复的n个数
- win7 ubuntu 开发板ping不通 解决方法
- ios中,uiimage拼接图片的方法
- 两分钟彻底让你明白Android中onInterceptTouchEvent与onTouchEvent
- js tab切换卡
- 新建一个多文档的MFC程序,取消自动创建的文件
- 从n中取出m个不重复的数
- 常用shell实例收集
- android RelativeLayout 内容居中解决办法
- javah 命令小结
- 【Oracle Database 12c新特性】 12c DataPump Expdp/Impdp新特性
- UNIX网络编程——客户/服务器程序设计示范(六)
- eclipse内存分析工具MAT浅谈(一)
- Parcel 在Android 中的应用
- allegro中Autosilk top, Silkscreen top 和Assembly top 和 place bound top 区别