IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++快速生成多个一维随机数组 -> 正文阅读

[C++知识库]C++快速生成多个一维随机数组

一、
假如要生成一个包含包含9个元素的一维数组,元素分别是1到9这9个整数随机排列,每个数字都出现一次。
产生思路为:
1.产生一个全0的数组A
2.产生一个1到9之间的随机数a
3.将a放到A中
4.继续产生随机数,并判断a是否存在于A中
5.若在则跳过,不在则放入A中
6.9个数字都填完以后结束
运行程序如下`

#include <iostream>
int main()
{
	int num[9] = { 0 };
	int i = 0;
	while (num[8] == 0)
	{
		srand((int)time(0));  // 产生随机种子  把0换成NULL也行
		int a = (rand() % 9) + 1;
		int  start = 0;
		int  end = 8;
		int* result = find(num + start, num + end, a);
		if (result == num + end)
		{
			num[i] = a;
			i++;
		}
	}
	for (int i = 0; i < 9; i++)
		cout << num[i] << ' ';
	return 0;
}

运行结果如图所示:
在这里插入图片描述结果显示正确
二、
上面写的程序在实际运行时,产生一个数组要花费十秒左右的时间,如果想要快速产生大量数组,比如成百上千个,这段程序就不适用了。
主要原因就出在下面这两行

srand((int)time(0));  // 产生随机种子  把0换成NULL也行
int a = (rand() % 9) + 1;

C++产生随机数是通过rand函数计算得到的,是一种伪随机数,开始计算时需要一个随机种子,当随机种子相同时,得到的随机数也是一样的。所以想得到不同的随机数就要设置不同的随机种子。
srand函数就是设置随机种子的,time(0)的返回值是从1970年1月1日至今所经历的时间(以秒为单位),转换整形后由srand((int)time(0))作为了随机种子,可以保证随机种子的不同。
常见产生随机数的方式,都是用当前时间作为随机种子的,这样做比较简单。但问题就在于产生不同随机种子的时间至少要间隔一秒,当需要产生大量随机数时就会导致时间的增加。所以此时并不适用直接将时间作为随机种子。
改进程序如下:

int main()
{
	for (int i = 0; i < 9; i++)    //假设要生成9个数组
	{
		int k = (int)time(0);      //只去一次当前时间
		int num[9] = { 0 };
		int m = 0;
		int j = 50 * (i * i * i + 100 + i * i * 5 - 20)+k;
		\\这个有关i的表达式是我随便写的,每个人都可以写自己的,只要让当i不同时计算结果差距较大就可以
		\\由于每次得到的i不同,与k结合以后的j就都不会相同
		while (num[8] == 0)
		{
			srand(j);     //此时就能保证每次的随机种子不同
			int a = (rand() % 9) + 1;
			int  start = 0;
			int  end = 8;
			int* result = find(num + start, num + end, a);
			if (result == num + end)
			{
				num[m] = a;
				m++;
			}
			j++;
		}
		for (int i1 = 0; i1 < 9; i1++)
		{
			cout << num[i1];
		}                                 
		cout << endl;
	}
	return 0;
}

运行结果如图:
在这里插入图片描述运行结果正确,并且运行时间不到一秒钟。

三、
这段程序同样还有缺点,我在实测产生一百个数组时,发现产生速度虽然韩快,但偶尔会出现两个相邻数组一模一样的情况。我认为还是随机种子的设置不够好,没办法做到完全随机。如果是生成9个数组,没有发现过出现一样的数组。

四、
使用rand产生随机数的公式如下:
要取得[0,n) 就是rand()%n 表示 从0到n-1的数
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 13:48:12  更:2022-01-08 13:48:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:52:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码