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

简介:        前一篇文章中,我们在Java中用实现两种不同接口的类,解决了不重复选择随机数的问题。现在我们在C++中,通过几种不同的算法来解决上述问题。

       前一篇文章中,我们在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


目录
相关文章
|
7月前
|
算法 数据安全/隐私保护
火山中文编程 -- MD5算法和SHA算法
火山中文编程 -- MD5算法和SHA算法
55 0
火山中文编程 -- MD5算法和SHA算法
|
18天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
32 2
|
2月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
35 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
2月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
|
7月前
|
存储 分布式计算 算法
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
98 0
|
4月前
|
存储 算法 搜索推荐
编程之旅中的算法启示
【8月更文挑战第31天】在编程世界的迷宫里,算法是那把钥匙,它不仅能解锁问题的答案,还能引领我们深入理解计算机科学的灵魂。本文将通过一次个人的技术感悟旅程,探索算法的奥秘,分享如何通过实践和思考来提升编程技能,以及这一过程如何启示我们更深层次地认识技术与生活的交织。
|
5月前
|
存储 算法 搜索推荐
告别低效编程!Python算法设计与分析中,时间复杂度与空间复杂度的智慧抉择!
【7月更文挑战第22天】在编程中,时间复杂度和空间复杂度是评估算法效率的关键。时间复杂度衡量执行时间随数据量增加的趋势,空间复杂度关注算法所需的内存。在实际应用中,开发者需权衡两者,根据场景选择合适算法,如快速排序(平均O(n log n),最坏O(n^2),空间复杂度O(log n)至O(n))适合大规模数据,而归并排序(稳定O(n log n),空间复杂度O(n))在内存受限或稳定性要求高时更有利。通过优化,如改进基准选择或减少复制,可平衡这两者。理解并智慧地选择算法是提升代码效率的关键。
71 1
|
4月前
|
存储 算法
【C算法】编程初学者入门训练140道(1~20)
【C算法】编程初学者入门训练140道(1~20)
|
5月前
|
存储 算法 Python
震撼!Python算法设计与分析,分治法、贪心、动态规划...这些经典算法如何改变你的编程世界!
【7月更文挑战第9天】在Python的算法天地,分治、贪心、动态规划三巨头揭示了解题的智慧。分治如归并排序,将大问题拆解为小部分解决;贪心算法以局部最优求全局,如Prim的最小生成树;动态规划通过存储子问题解避免重复计算,如斐波那契数列。掌握这些,将重塑你的编程思维,点亮技术之路。
75 1
|
6月前
|
机器学习/深度学习 算法 搜索推荐
编程之舞:探索算法的优雅与力量
【6月更文挑战第10天】在软件的世界里,算法是构筑数字宇宙的基石。它们如同精心编排的舞蹈,每一个步骤都充满着逻辑的美感和解决问题的力量。本文将带领读者走进算法的世界,一起感受那些精妙绝伦的编程思想如何转化为解决现实问题的钥匙。
34 3
下一篇
无影云桌面