用C++生成一个不重复随机数 数组

背景

初学C++,因为在B站上做黑马C++基础课上的一个案例,突然想到了一个问题

如上图所示,进行冒泡排序时,黑马老师给了一个示例数组,当然我也可以自己给定一个数组,但是天生放荡不羁爱自由(开个玩笑),我就不想自己给定一个数组。

我想的是让电脑自己给我生成一个数组,但是因为又是初学,很多函数的用法又不会,虽然的确也在csdn上看到了很高级的用法,但是目前水平还看不懂。

所以不妨就自己写一个函数吧   

废话结束   正文开始

#include<iostream>
using namespace std;

   //定义一个返回型函数
   //该函数能返回一个动态数组
   //主要功能:生成一个从a开始的b个不重复的随机数,并将它们导入一个
//动态数组中,随后将其值返回到主函数进行运用

int *random(int a,int b) //最后返回的数组“suijishu”是动态的
//所以定义的函数名得用* (指针)
{

	int *suijishu = new int[b]();  //初始化一个动态数组
	int c = 0;  //定义一个中间变量
	c = rand() % b + a;  //将变量赋值为从a到(a+b)范围中的一个随机数

	*(suijishu) = c;  //先将随机数赋值给数组的第一个位置
	int flag = 0;
	for (int i = 1; i < b; i++)  //将数组的其他位置也逐一赋值成随机数
		//且不能重复
		//这里的i初值得是1,因为内层循环有一个k<i的比较运算,如果不是1
		//那么k永远等于i等于0,也就不执行内层循环的语句,那么flag恒为0
		//函数也就会一直陷入死循环,电脑会死机
	{
N1:		   c = rand()%b + a;  //生成随机数
		
		for (int k = 0; k < i; k++)
	//将数组已有的元素与刚刚生成的随机数逐一做比对
		{ 
		    if (c == *(suijishu + k))
			{
				flag = 0;
				break;
    //如果数组中的元素和刚刚生成的随机数已经有重复了则重新生成随机数
	//利用flag作为判断因子
	//不重复则给数组赋值,重复了则重新生成
	//直接break,以免浪费时间
			}
			else
			{
				flag = 1;
			}
		}
		/*cout << "c=" << c << endl;
		cout << "flag=" << flag << endl;*/
		//作调试用
		if (!flag)
		{
			goto N1;
	//得用goto语句,否则当执行完一个循环时,i会+1,这就违背了初衷
		}
		else
		{
			*(suijishu + i) = c;
		}
	}

	//for (int i = 0; i < 8; i++)
	//{
	//	cout << *(suijishu+i) << " ";
	//}
	//cout << endl;


	//delete[] suijishu;
	//做调试用



	return suijishu;
	//最后返回数组
	delete[] suijishu;
	//因为new使用了动态内存,必须释放,不然可能会对电脑产生影响
}


int main()
{
	//测试一下,看看效果如何
	int *arr;
    //同时,在运用该函数时也得带*,也即运用指针
	arr = random(1, 9);
	//从1开始的9个随机数
	for (int i = 0; i < 9; i++)
	{
		cout << *(arr+i) << " ";
	}
	cout << endl;
	delete[] arr;
	//同样使用结束也需要释放其空间


	return 0;
	system("pause");
}

(ps:因为经常看到csdn上有很多废话一大堆,讲了一通,让人似懂非懂,最后代码却不给,所以直接先给代码吧)

如果跟过黑马老师冒泡排序之前课程的同学对于里面绝大多数的操作应该是能懂的,例如rand()%b+a或者goto语句的用法。但是像定义动态数组,如int *suijishu = new int[b](); 可能就不太理解了。其实我自己也不太理解,因为确实也是初学者,但是感兴趣的话可以去b站搜索“如何使用C++创建动态数组”相关话题。

题外话

也给一下我自己的冒泡排序代码和goto语句的代码吧,因为真的感觉很帅

#include <iostream>
using namespace std;

int main()
{
	int arr[9] = { 2,5,4,1,7,9,6,3,8 };
	for (int j = 0; j < 9; j++)
	{
		for (int i = 0; i < 8; i++)
		{
			int more = 0;
			if (arr[i] > arr[i + 1])
			{
				more = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = more;
				


			}
			else
			{
				more = arr[i + 1];
			}



		}
	}
	
	for (int k = 0; k < 9; k++)
	{
		cout << arr[k] << endl;
		
	}
		system("pause");

	return 0;


}
#include <iostream>
using namespace std;

int main()
{
	int u = 0;
	int n = 0;
N1:    //这个相当于执行for嵌套中的内层循环
	//当u小于10时,输出* ,直到这一行有10个*之后,跳出内层而执行外层循环
	if (u >= 10)
	{
		goto N2; //实际执行的是跳出内层循环
	}  
		cout << "* ";
		u++;
		goto N1;

N2:    //外层循环,当执行完内层循环之后将会跳转至外层循环
		
		cout << endl;  //打印下一行
		n++;
		if (n >= 10)  //判断是否完成外层循环,达到条件后跳转至N3,
			//完成整个goto循环体,而后再执行之后的语句
		{
			goto N3;
		}
		u = 0;
		goto N1;

N3:


		//利用goto语句实现循环语句输出一个三角形的*阵列
		
		int p = 0;
		int q = 0;
N4:  
		if (q >= 10)   
		{
			goto N6;   //外层循环结束
		}
		cout << endl;
		q++;
		p = 0;   //对内层判断因子清0初始化
		goto N5;

N5:

		if (p >= q)
		{
			goto N4;  //当满足条件时再跳转回外层
		}
		cout << "* ";
		p++;
		goto N5;
N6:

		
		//for (int i = 0; i < 10; i++)
		//{
		//	for (int j = 0; j < i; j++)
		//	{
		//		cout << "* ";
		//	}
		//	cout << endl;
		//}
		




	return 0;
	system("pause");
}

感觉在代码之中就已经解释的很全了,如果看不太懂上面的操作也是正常,因为我也刚开始学,如果有懂的大佬也想评论两句,也欢迎指正!谢谢

最后放一下运行结果吧

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值