无重复数字的随机数字数组
这几天看MFC,头晕眼花,也觉得没有什么可以写的。
今天学习之余,看到一个面试题“1000个范围0-2000的数字,进行排序打印出来”。就想着实现一下。
第一步先要建立1000个范围确定的不重复随机数字数组。
建立数组的过程,首先想到在循环中随机数对范围取模,新生成的数字再与之前已经生成的数字进行比较,如果不重复,则放入数组,与已有数字重复,则重复操作。这样实现出来之后,效率非常低下,不能接受。
既然范围确定,可以先建立一个顺序数组作为待选数组,然后从其中不断挑选数字。挑选数字时,以随机数为下标。这样做因为随机数会出现重复,挑选出的数字也就会重复。
解决随机数字重复的问题比较困难,可以使同样的下标,在不同轮数的数字不同。这就需要将已经选入数组的元素从待选数组中剔除。对于数组的操作,删除一个元素,将后续元素前移,效率有些低。可以将末尾的元素放到挑选出数字的位置,将待选数组的“长度”减一。如果选中的数字在数组的“尾部”,自赋值并不会出现问题,数组“长度”减一之后,刚刚挑选的元素也从待选数组中排除,所以尾部并不需要特殊处理。
用这种方法实现的随机数组,时间复杂度为O(n),是比较理想的。
对于“排序”,根据要求只是“打印”,并且说明速度非常快。
这样同样需要多一个数组,称为标记数组
一遍遍历,将标记数组中随机数组元素对应的下标的元素标记。再一遍遍历,打印标记数组中有标记的“下标”。
1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 //生成无重复数字的随机数数组5 void random_arr(int def_arr[], const int value,6 int sel_arr[], const int size)7 {8 int i = 0;9 //待选数组初始化 10 for (i = 0; i < value; i++) 11 def_arr[i] = i; 12 //从待选数组挑取数字到随机数组 13 i = 0; 14 int max = value; 15 while (i < size) 16 { 17 int temp = rand() % max; 18 sel_arr[i++] = def_arr[temp]; 19 def_arr[temp] = def_arr[--max]; 20 } 21 } 22 //打印数组 23 void print_arr(const int* arr, const int size) 24 { 25 int i = 0; 26 for (i = 0; i < size; i++) 27 printf("%d ", arr[i]); 28 printf("\n"); 29 } 30 //主函数 31 int main(void) 32 { 33 srand(time(0)); 34 int size = 1000, value = 2000; 35 int def_arr[value]; 36 int sel_arr[size]; 37 random_arr(def_arr, value, sel_arr, size); 38 print_arr(sel_arr, size); 39 printf("\n\n\n"); 40 //伪排序 41 int signal_arr[2000] = {0}; 42 int i = 0; 43 for (i = 0; i < 1000; i++) 44 signal_arr[sel_arr[i]] = 1; 45 for (i = 0; i < 2000; i++) 46 if (signal_arr[i] = 1) 47 printf("%d ", i); 48 printf("\n"); 49 return 0; 50 }
转载于:https://www.cnblogs.com/itit/p/3491506.html
无重复数字的随机数字数组相关推荐
- python组成不重复的三位数是多少_超星Python 练习实例1-组成多少个互不相同且无重复的三位数字...
数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码: #!/u ...
- C/C++ 数字1234,能组成多少个互不相同且无重复的三位数数字。
分析:设有a,b,c三个变量,可以用于控制三位数的个位(c),十位(b*10),百位(a*100),使用for循环嵌套,分别控制个位.十位.百位的切换,遇到符合条件的数便输出,定义变量count用于计 ...
- C语言随机字母生成,C++ 随机数字以及随机数字加字母生成的案例
我就废话不多说了,大家还是直接看代码吧~ #include #include void MainWindow::slot_clicked() { QString strRand; int length ...
- 输出用1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数(C语言)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: [实验案例3:嵌套循环结构的使用] 输出用1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数. [实验指导] 分 ...
- JAVA实现随机无重复数字功能
本文给大家介绍如何在JAVA中实现随机无重复数字的功能.如果您是初学者的话,有必要看一看这篇文章,因为这个功能一般会在面试中遇到.包括我本人在招聘人员的时候也喜欢拿这个问题去问别人,主要看一看考虑问题 ...
- java随机生成10个不重复的数字,随机生成10个不重复的0-100的数字(实例讲解)
在面试时,面试官问了我一道js题:随机生成一个含有10个元素的数组,且元素为0-100的不重复的整数.当时的第一反应是for循环生成10个数字,但是可能会有重复的情况:进一步思考,需要对生成的数字进行 ...
- php获取不重复的随机数字,php如何生成不重复的随机数字
[摘要] PHP即"超文本预处理器",是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 ...
- 获取随机数字且不重复
package practise;import java.util.Random; import java.util.Scanner; //案例:获取随机数字且不重复 public class Tes ...
- 全排列算法(无重复数字全排列/有重复数字全排列)/ 组合算法/ 求子集算法
写在前面 全排列 1 无重复数字全排列 1.1 紫书版本 1.2 回溯法 2 有重复数字全排列 复盘易错点(可跳过) 写在前面 很久很久以前就想写的一篇博客,因为懒一直没开工,但是学习全排列算法算是我 ...
最新文章
- 触控(Touch) 、 布局(Layout)
- ACL控制访问列表原理+实验
- grafana+prometheus快速搭建MySql监控系统实践
- Linux下的各种文件阅读器
- PHP 一键安装扩展的程序-(Windows 系统)
- Web Storage API的介绍和使用
- HTTP 200 OK和HTTP 304 Not modified的由来
- 雷军微博念了几句诗 评论区疯狂猜谜
- STM8学习笔记---PWM互补波形输出
- ProxyToken:微软 Exchange 服务器中的认证绕过新漏洞,可窃取用户邮件
- 分享 ASP.NET WebForm 另外一种开发方式,逃离服务器控件
- 光纤接口怎么接 图解_视频光端机怎么连接,视频光端机接法图解
- mysql explode函数_hive中,lateral view 与 explode函数
- 即时通讯(IM)开源项目OpenIM本周版本发布-v1.0.6
- 怎样设置默认打印机(HttpPrinter 易桥打印中间件)
- 【愚公系列】2022年10月 使用win11系统自带远程桌面,远程控制VMware中Windows虚拟机系统
- 2022年诺贝尔物理学奖的科学内涵辨识
- macbook视频格式转换_为了找到MacBook这个视频转换软件我哭了!太强大了!
- Tetris项目总结
- 5-1链队入队出队操作
热门文章
- 饮冰三年-人工智能-linux-07 硬盘分区、格式化及文件系统的管理
- [转]FPGA的GTP信号PCB布线要点
- Oracle Schema Objects(Schema Object Storage And Type)
- jquery刷新iframe页面的方法(兼容主流)
- 【iOS学习笔记】IOS开发中设置applicationIconBadgeNumber和消息推送
- petshop4.0 具体解释之中的一个(系统架构设计)
- [转] 字符集、字符编码
- DOS 循环 FOR
- Android中AIDL的使用详解
- Activity启动过程