生成互不相同随机数的一种算法

news/2024/7/20 10:24:29 标签: 算法, random, null, delete, file, ios

C++中常用rand()和srand()函数相结合来生成每次执行都不相同的一组随机数,常见的写法如下:

#include <iostream>
#include <cstdlib>
#include <tchar.h>
#include <ctime>

using namespace std;

int _tmain(int argc,_TCHAR* argv[])
{
	int randomSum=5,randomLimit=10;
	int random=0;
	srand(static_cast<unsigned int>(time(NULL)));
	for(int i=0;i<randomSum;i++)
	{
		random=rand()%randomLimit;
		cout<<random<<"\t";
	}
	cout<<endl;
	system("PAUSE");
	return 0;
}
这个程序是随机产生5个0~9(包括0和9)之间的随机数。每次执行程序,产生的是不同的。比如某两次的执行结果如下:




从结果中可以看出产生的随机数中有重复的。

当然如果实验的次数足够大时,每个数产生的概率肯定是差不多的。但具体大每一次中不免有重复的数字,怎么才能产生一组互不相等的随机数呢?

有很多种方法,这里介绍一种实现,具体如下:

一、动态生成一个数组,其长度是要产生随机数的上界,每个元素的值为其对应的下标。

二、随机生成该范围内的一个数,以该数为数组下标,取出对应的数组中的元素(其实数组中的元素和该随机数一样),取出后,将下标对应的数组元素赋值为-1(赋值-1是因为随机数中或许有0),来作为下次判断的依据。

三、再产生该范围内的随机数,如果对应的数组下标中的元素是-1,就再生成,直到不是-1为止。

四、重复步骤二、三,直到产生够所需的随机数个数。

注意点:随机数个数应小于等于随机数的范围

具体的代码如下:

void RandomNumbers(int limit,int sum)
{
	fstream file("data.txt",ios::out);
	int count=0,number=0;
	int *temp=new int[limit];
	for(int i=0;i<limit;i++)
	{
		temp[i]=i;
	}

	srand(static_cast<unsigned int>(time(NULL)));
	for(int i=1;i<=sum;i++)
	{
		number=rand()%limit;
		while(temp[number]==-1)
		{
			number=rand()%limit;
		}
		file<<temp[number]<<"\t";
		count++;
		if(count%10==0)
		{
			file<<endl;
		}
		temp[number]=-1;
	}
	delete []temp;
	temp=NULL;
	file.close();
	cout<<"已产生"<<sum<<"个"<<"大于等于0少于"<<limit<<"的互不相等的随机数"<<endl;
}


该函数实现的是产生0~limit(包括0和limit)内的sum个随机数,并存入data.txt文件中。

程序运行结果:



思考:该算法就是用空间来换时间,如果每次产生一个随机数都和前面产生的比较的话,将耗费大量的时间。

还有什么更好的,大家都说说哈O(∩_∩)O~ 


http://www.niftyadmin.cn/n/1332088.html

相关文章

这 7 个 Spring Boot 项目够经典!

点击上方 果汁简历 &#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达前言不得不佩服 SpringBoot 的生态如此强大&#xff0c;今天给大家推荐几款优秀的后台管理系统&#xff0c;小伙伴们再也不用从头到尾撸一个项目了。SmartAdmin我们开源一套漂亮的代码和一套…

API接口的安全设计验证:ticket,签名,时间戳

作者&#xff1a;一剑天门cnblogs.com/dslx/p/14116294.html概述与前端对接的API接口&#xff0c;如果被第三方抓包并进行恶意篡改参数&#xff0c;可能会导致数据泄露&#xff0c;甚至会被篡改数据&#xff0c;我主要围绕时间戳&#xff0c;token&#xff0c;签名三个部分来保…

《计算机图形学》实验三:图形变换

本博客计算机图形学系列文章索引&#xff1a; 地址&#xff1a;《计算机图形学系列相关文章索引&#xff08;持续更新&#xff09;》 参考教材&#xff1a;《计算机图形学》 机械工业出版社 &#xff0c;徐文鹏主编 源代码如下&#xff1a; #include <tchar.h> #include…

骚操作 !IDEA 防止写代码沉迷插件 !

原文地址&#xff1a;juejin.cn/post/6914083794806898695图片前言当初年少懵懂&#xff0c;那年夏天填志愿选专业&#xff0c;父母听其他长辈说选择计算机专业好。从那以后&#xff0c;我的身上就有了计院深深的烙印。从寝室到机房&#xff0c;从机房到图书馆&#xff0c;C、C…

《计算机图形学》实验四:裁剪

本博客计算机图形学系列文章索引&#xff1a; 地址&#xff1a;《计算机图形学系列相关文章索引&#xff08;持续更新&#xff09;》 参考教材&#xff1a;《计算机图形学》 机械工业出版社 &#xff0c;徐文鹏主编 实验内容&#xff1a;利用Cohen-Sutherland编码裁剪算法&…

中点画直线算法

本博客计算机图形学系列文章索引&#xff1a; 地址&#xff1a;《计算机图形学系列相关文章索引&#xff08;持续更新&#xff09;》 中点画直线算法的具体内容不再给出&#xff0c;想知道的参考教材。 我们的教材是&#xff1a;《计算机图形学》 机械工业出版社 &#xff0c;…

PageHelper 被曝有性能问题,你中招了吗?

点击上方蓝色字体&#xff0c;选择“设置星标”优质文章&#xff0c;第一时间送达作者&#xff1a;岁月安然blog.csdn.net/baidu_38083619/article/details/82463058前因项目一直使用的是PageHelper实现分页功能&#xff0c;项目前期数据量较少一直没有什么问题。随着业务扩增&…

Windows的窗口类风格、鼠标光标风格

一、窗口类 一个窗口类不是一个C类&#xff0c;而是早于并存在于C之外的窗口专有的类。窗口类的作用就像一个模板&#xff0c;可以由此创建其他的窗口&#xff0c;并可共享某些特征&#xff0c;包括下面的特征&#xff1a; 1、类风格&#xff1a;包括能给与窗口的微小的特征。…