【算法编程】随机数的不重复选择

       前一篇文章中,我们在Java中用实现两种不同接口的类,解决了不重复选择随机数的问题。现在我们在C++中,通过几种不同的算法来解决上述问题。在下面的四种算法实现中,用的随机函数都是C的库函数,这个函数产生的随机数的范围是限定的,[0,
32767]。当然我们可以通过四则运算来改变取值范围。具体的算法实现如下:

#include<iostream>
#include<ctime>
#include<algorithm>
#include <set>
using namespace std;

/****************************************\
函数功能:从n个数中随机选择m个不同的数
函数输入:n为样本空间,m为选择的个数
函数输出:在屏幕上打印选取的数
算法描述:结果范围在[0,n),呈递增数列,
          当n比较大m比较小时,耗时较大
\****************************************/
void random1(int n,int m)
{
	srand(time(NULL));//使用这个就可以每次运行不同
	for(int i=0;i<n;i++)
	{
		if(rand()%(n-i)<m)
		{
			cout<<i<<endl;//随机数结果按递增顺序排列
			m--;
		}
	}
}

/****************************************\
函数功能:从n个数中随机选择m个不同的数
函数输入:n为样本空间,m为选择的个数
函数输出:在屏幕上打印选取的数
算法描述:结果范围在[0,n),思想简单:每生成
		一个随机数就检查是否与已存在的数重合
\****************************************/
void random2(int n,int m)
{
	int *a = new int[m];
	srand(time(NULL));//使用这个就可以每次运行不同

	a[0]=rand()%n;
	int temp=0;
	int j=0;
	bool flag=true;
	for(int i=1;i<m;i++)
	{
		temp=rand()%n;
		flag=true;
		for(j=0;j<i;j++)//循环遍历是否有重复的数
		{
			if(temp==a[j])
			{
				i--;
				flag=false;
				break;//其实这里可以用goto语句,但是goto语句不推荐使用
			}
		}
		if(j==i&&flag)
			a[i]=temp;

	}

	for(int k=0;k<m;k++)
		cout<<a[k]<<" ";
}

/****************************************\
函数功能:从n个数中随机选择m个不同的数
函数输入:n为样本空间,m为选择的个数
函数输出:在屏幕上打印选取的数
算法描述:结果范围在[0,n),从已存在的数组
	      a中选择,当n比较大时,占用空间大
\****************************************/
void random3(int n,int m)
{
    int i;
	srand(time(NULL));//使用这个就可以每次运行不同
    int *a=new int[n];
    for(i=0;i<n;i++)
        a[i]=i;
    for(i=0;i<m;i++)
    {
        int j=i+rand()%(n-i); //随机产生 [i,n-1) 的数作为数组的下标
        if(i!=j)
        {
            int temp=a[i];//将a[i]与a[j]互换
            a[i]=a[j];
            a[j]=temp;
		//	swap(a[i],a[j]);//上面三行的互换可以调用库函数
        }
    }
   // sort(&a[0],&a[m]); //进行排序
    for(i=0;i<m;i++)
         cout<<a[i]<<" ";
}  

/****************************************\
函数功能:从n个数中随机选择m个不同的数
函数输入:n为样本空间,m为选择的个数
函数输出:在屏幕上打印选取的数
算法描述:结果范围在[0,n),利用set中
		  没有重复元素的特性
\****************************************/
void random4(int n,int m)
{
    set<int> s; //利用set中没有重复元素的特性
	srand(time(NULL));//使用这个就可以每次运行不同
    while(s.size()<m)
        s.insert(rand()%n); //若是重复元素则不插入 

    for(set<int>::iterator iter=s.begin();iter!=s.end();iter++)
        cout<<*iter<<" ";
}  

void main()
{
	cout<<RAND_MAX<<endl;//随机数的最大范围32767
	//random1(6,4);
	//random2(6,4);
	//random3(6,4);
	random4(6,4);
}

原文:http://blog.csdn.net/tengweitw/article/details/24431203

作者:nineheadedbird

时间: 2025-01-21 18:16:22

【算法编程】随机数的不重复选择的相关文章

【Java编程】随机数的不重复选择

      随机数的不重复选择就是从n个数中随机选取m(m<n)个数.在本文中,我们用Java来实现.因此我们先介绍Java的相关知识. 在Java中,Java.util.Set接口和Java.util.List接口一样,都是继承自Java.util.Collection接口.但是两者有不同的特点:       List接口:一种能包含重复元素的有序集合,具体实现该接口的类有:Vector.Stack.ArrayList.LinkedList等等.       Set接口:一种不包含重复元素的集

CCF CCSP2016:算法编程是最基本、最重要的能力

"湖南卫视超级女声的名气那么大,我也想把这个比赛做成计算机领域里有名气的比赛."这是CCF前理事长.CCF CCSP竞赛委员会主席.清华大学教授郑纬民对CCF CCSP比赛的期盼. 11月26日,首届CCF大学生计算机系统与程序设计竞赛(The Collegiate Computer System & Programming Contest, CCSP)在北京理工大学良乡校区举行.大赛由中国计算机学会(CCF)主办,清华大学等13所著名高校共同发起的.旨在提高高校计算机教育水平

C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等_C 语言

本文实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序 首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ #include <iostream> template<class T> void swap_value(T &a, T &b) { T t

推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】

    最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽然目前人气可能一般,但这里面题目和资源还是比较丰富的,希望给初学者一个帮助. 本文原文地址:[推荐]一个算法编程学习中文社区-51NOD[算法分级,支持多语言,可在线编译] 1.51NOD论坛介绍     该论坛网址:http://www.51nod.com/index.html     论

c++算法编程,急求,谢谢

问题描述 c++算法编程,急求,谢谢 正方形网格中,每个格点有一定数量的宝石.小明从网格左上(0,0)出发, 采集宝石.小明每次横向或竖向移动不超过 ...k.个方格后,停下来采集宝石.强迫 症的小明要求每次采集宝石数量不低于上一次,否则宁愿停止采集. 注: 停下来采集宝石后,才能转向: 一次移动不超过 k 步即,可以是 1,2.-k 经过的格点的宝石数量没有要求: 例如 : 对如下网格,网格中的整数为宝石数: 1 2 5 10 11 6 12 12 7 当 k 为 1 时,优值为 37 : k

c语言-请教一个C编程 打印输出图像的算法编程

问题描述 请教一个C编程 打印输出图像的算法编程 解决方案 大概就是这样,建立笛卡尔坐标系. 用point()函数里的嵌套for循环来输出每一个字符,然后把代表坐标的i和j传递给getChar()函数通过坐标来决定输出的是什么字符. 解决方案二: char getChar(int x,int y,int n) { if(x<0) x=-x; if(y<0) y=-y; if(x>y) { if(n-x<=2) return 'x'+n-x; else return '0'+n-x-

Android编程实现变化的双重选择框功能示例

本文实例讲述了Android编程实现变化的双重选择框功能.分享给大家供大家参考,具体如下: 原理:定义四个RadioGroup,通过第一个RadioGroup的选择来控制其余几个radiogroup的显隐 布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

【算法编程】小学数学题难倒博士

昨天在科学网上得知这样一个新闻<越南小学数学题难倒博士>,据悉题目来自越南保禄小学三年班,不过报道称该题难倒了上至博士下至家长,未免也太言过其实了. 题目描述 学生需要在下图表格中按由上至下.从左到右的顺序,填入1~9的数字,可重复填写,并按先乘除后加减(图中冒号代表除法)的运算法则,完成整条算式. 解题方法 显然,这题对于我们这种程序员来说完全不是问题,只要在大一上过C语言的学生(我们学校全校都学过C,即使是文科专业)基本上都可以用九重for循环来穷举解出此题,下面我分别用C和Matlab实

算法-怎么检测图片的重复度

问题描述 怎么检测图片的重复度 比如现在有两张图片,怎么判断这两张图片是否相似,相似度为多少,优美有相应的算法 解决方案 直方图是最简单http://blog.csdn.net/jia20003/article/details/7771651 复杂的http://deepfuture.iteye.com/blog/1583934http://blog.csdn.net/jiutianhe/article/details/39896931 解决方案二: 这个可参照教材,图片信息隐藏 解决方案三: