我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java生成不重复的随机数方法总结

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java生成不重复的随机数方法总结

本文给大家介绍如何在JAVA中实现随机无重复数字的功能。(相关视频课程推荐:java视频教程)

为了更好地理解这个题意,我们先来看下具体内容:生成一个1-100的随机数组,但数组中的数字不能重复,即位置是随机的,但数组元素不能重复。

在这里呢,没有给我们规定数组的长度,我们可以让它是1-100之间的任意长度。

接下来让我们看一下几种实现方法并对这几种方法作个对比。

通常我们会使用ArrayList或数组来实现,先来看下ArrayList实现过程,如下面代码所示:

import java.util.ArrayList;
import java.util.Random;


public class Demo {
    public static void main(String[] args) {
        Object[] values = new Object[20];
        Random random = new Random();
        ArrayList list = new ArrayList();

        for(int i = 0; i < values.length;i++){
            int number = random.nextInt(100) + 1;
            
            if(!list.contains(number)){
                list.add(number);
            }
        }
        
        values = list.toArray();
        
        // 遍历数组并打印数据
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "	");
            
            if(( i + 1 ) % 10 == 0){
                System.out.println("
");
            }
        }
    }
}

使用数组实现的过程如下所示代码:

import java.util.Random;


public class Demo4 {
    public static void main(String[] args) {
        int[] values = new int[20];
        Random random = new Random();
        
        for(int i = 0;i < values.length;i++){
            int number = random.nextInt(100) + 1;
            
            for(int j = 0;j <= i;j++){
                if(number != values[j]){
                    values[i]=number;
                }                              
            }
        }
        
        // 遍历数组并打印数据
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "	");
            
            if(( i + 1 ) % 10 == 0){
                System.out.println("
");
            }
        }
    }
}

上面这两个实现过程效率比较低的。因为在每次添加时都要去遍历一下当前列表中是否存在这个数字,时间复杂度是O(N^2)。我们可以这样思考一下:既然涉及到无重复,我们可以想一下HashSet和HashMap的功能。

HashSet实现Set接口,Set在数学上的定义就是无重复,无次序的集合。而HashMap实现Map,也是不允许重复的Key。这样我们可以使用HashMap或HashSet来实现。

在使用HashMap实现时,只需要将它的key转化成数组就Ok了,如下代码:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import java.util.Map.Entry;


public class Demo {
    public static void main(String[] args) {
        int n = 0;
        Object[] values = new Object[20];
        
        Random random = new Random();
        HashMap hashMap = new HashMap();
        
        // 生成随机数字并存入HashMap
        for(int i = 0;i < values.length;i++){
            int number = random.nextInt(100) + 1;
            hashMap.put(number, i);
        }
        
        // 从HashMap导入数组
        values = hashMap.keySet().toArray();
        
        // 遍历数组并打印数据
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "	");
            
            if(( i + 1 ) % 10 == 0){
                System.out.println("
");
            }
        }
        
//        Iterator iter = hashMap.entrySet().iterator();
//        // 遍历HashMap
//        while (iter.hasNext()) {
//            Entry entry = (Entry)iter.next();
//            int key = entry.getKey();
//            n++;
//            
//            System.out.print(key + "	");
//            
//            if(n % 10 == 0){
//                System.out.println("
");
//            }
//        }
    }
}

由于HashSet和HashMap的关系太近了,HashSet在底层就是用HashMap来实现的,只不过没有Value的集合,只有一个Key的集合,所以也可使用HashSet来实现,如下代码:

import java.util.HashSet;
import java.util.Random;


public class Test {
    public static void main(String[] args) {
        Random random = new Random();
        Object[] values = new Object[20];
        HashSet hashSet = new HashSet();
        
        // 生成随机数字并存入HashSet
        for(int i = 0;i < values.length;i++){
            int number = random.nextInt(100) + 1;
            hashSet.add(number);
        }
        
        values = hashSet.toArray();
        
        // 遍历数组并打印数据
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "	");
            
            if(( i + 1 ) % 10 == 0){
                System.out.println("
");
            }
        }
    }
}

这样实现效率稍微好些。如果给我们限定了数组的长度,只需要变换下for循环,设置成whlie循环就可以了。如下所示:

import java.util.HashSet;
import java.util.Random;


public class Test {
    public static void main(String[] args) {
        Random random = new Random();
        Object[] values = new Object[20];
        HashSet hashSet = new HashSet();
        
        // 生成随机数字并存入HashSet
        while(hashSet.size() < values.length){
            hashSet.add(random.nextInt(100) + 1);
        }
        
        values = hashSet.toArray();
        
        // 遍历数组并打印数据
        for(int i = 0;i < values.length;i++){
            System.out.print(values[i] + "	");
            
            if(( i + 1 ) % 10 == 0){
                System.out.println("
");
            }
        }
    }
}

以上几种相比较而言,使用HashMap的效率是比较高的,其实是HashSet,再次是数组,最后是ArrayList。如果我们生成10000个数据将会发现,使用HashMap花费时间是:0.05s,HashSet是0.07s,数组是:0.20s,而ArrayList是0.25s。有兴趣的可以设置下时间查看一下。

当然了,除了使用HashMap实现外,还有其它高效的方法。比如,我们可以把1-100这些数字存储在一个数组中,然后在for循环中随机产生两个下标,如果这两个下标不相等的话,可以交换数组中的元素,实现过程如下所示:

import java.util.Random;


public class Demo4 {
    public static void main(String[] args) {
        int values[] = new int[100];   
        int temp1,temp2,temp3;   
        Random r = new Random();   
        
        for(int i = 0;i < values.length;i++){
            values[i] = i + 1;
        }
        
        //随机交换values.length次   
        for(int i = 0;i < values.length;i++){   
            temp1 = Math.abs(r.nextInt()) % (values.length-1); //随机产生一个位置   
            temp2 = Math.abs(r.nextInt()) % (values.length-1); //随机产生另一个位置   
            
            if(temp1 != temp2){
                temp3 = values[temp1];   
                values[temp1] = values[temp2];   
                values[temp2] = temp3;
            } 
        }   
        
        // 遍历数组并打印数据
        for(int i = 0;i < 20;i++){
            System.out.print(values[i] + "	");
            
            if(( i + 1 ) % 10 == 0){
                System.out.println("
");
            }
        }
    }
}

更多java相关文章请关注java基础教程。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java生成不重复的随机数方法总结

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java生成不重复的随机数方法总结

本文给大家介绍如何在JAVA中实现随机无重复数字的功能。(相关视频课程推荐:java视频教程)为了更好地理解这个题意,我们先来看下具体内容:生成一个1-100的随机数组,但数组中的数字不能重复,即位置是随机的,但数组元素不能重复。在这里呢,没有给我们规定数组的
java生成不重复的随机数方法总结
2018-12-23

java生成不重复随机数的方法

Java中产生随机数1、调用java.lang下面Math类中的random()方法产生随机数新建一个文件后缀名为java的文件,文件名取为MyRandom,该类中编写如下的代码:public class MyRandom {public static voi
java生成不重复随机数的方法
2016-11-18

java生成不重复的随机数

java中要使生成的随机数不重复可以将已经生成的随机数放入到数组中,每次生成随机数时与数组的内容比较是否相等,相等则重新生成,不相等则存入数组。示例代码如下(生成10之内的4个不相等的整数): (推荐学习:java课程)public clas
java生成不重复的随机数
2017-09-04

java怎么生成不重复随机数

java中要使生成的随机数不重复可以将已经生成的随机数放入到数组中,每次生成随机数时与数组的内容比较是否相等,相等则重新生成,不相等则存入数组。 (推荐学习:java课程)示例代码如下(生成10之内的4个不相等的整数):public class
java怎么生成不重复随机数
2022-04-18

java中产生随机不重复数的方法

java中产生随机不重复数的方法:根据min和max,生成n个不重复的随机数。(注:范围[min,max],n ( max - min + 1 )){ return null; } // 将所有的可能出现的数
java中产生随机不重复数的方法
2021-01-15

java中使用什么方法生成不重复随机数

方法一:调用java.lang下面Math类中的random()方法产生随机数新建一个文件后缀名为java的文件,文件名取为MyRandom,该类中编写如下的代码:public class MyRandom { public static void ma
java中使用什么方法生成不重复随机数
2016-03-21

shell 生成随机数的实现方法总结

shell 生成随机数的实现方法总结 1. 使用系统的 $RANDOM 变量mimvp@ubuntu:~$ echo $RANDOM 17617$RANDOM 的范围是 [0, 32767] 如需要生成超过32767的随机数,可以用以下方法
2022-06-04

Java编程实现从给定范围内随机N个不重复数生成随机数的方法小结

本文实例讲述了Java编程实现从给定范围内随机N个不重复数生成随机数的方法。分享给大家供大家参考,具体如下:一、JAVA中生成随机数的方式1、在j2se中使用Math.random()令系统随机选取一个0~1之间的double类型小数,将其
2023-05-31

Java编程实现生成给定范围内不重复随机数的方法小结

本文实例总结了Java编程实现生成给定范围内不重复随机数的方法。分享给大家供大家参考,具体如下:在Java中的Math类中存在一个random()方法,该方法默认生成0.0到1.0之间的double型随机数;经过稍微处理,就可以产生我们需要
2023-05-31

生成8位随机不重复的数字编号的方法

生成随机不重复的数字编号在某些情况下也会用到,本文以生成8位随机不重复的数字编号为例与大家分享下具体的实现过程,感兴趣的朋友可以参考下
2022-11-15

java随机数生成的方法

本文小编为大家详细介绍“java随机数生成的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“java随机数生成的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。本教程操作环境:windows7系统、java
2023-06-30

java随机生成1~15之间不重复的数字

函数说明:random()方法用于返回一个随机数,随机数范围为 0.0 =< Math.random < 1.0。例如:产生一个0~9之间的整数为:(int)(Math.random()*10);产生一个1~10之间的整数则可以写成:(int)(Math.ra
java随机生成1~15之间不重复的数字
2016-03-22

VBS中怎么生成不重复随机数

VBS中怎么生成不重复随机数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。代码如下:dim Z(10),i for i=0 to 10 Z(I)=GetRnd(
2023-06-08

vb中怎么生成不重复随机数

在VB中生成不重复的随机数可以通过使用Random类来实现。你可以使用一个数组来存储已生成的随机数,然后在生成随机数时进行判断是否已存在该数,直到生成一个不重复的随机数为止。以下是一个示例代码:```vbDim random As New
2023-08-16

用Java生成N个不重复的随机数,3种实例

1、Random类和Set集合来完成 Java实现生成n个不重复的随机数可以使用Java中的Random类和Set集合来完成 具体代码如下: import java.util.HashSet;import java.util.Rand
2023-08-19

Python生成随机数组的方法小结

本文实例讲述了Python生成随机数组的方法。分享给大家供大家参考,具体如下: 研究排序问题的时候常常需要生成随机数组来验证自己排序算法的正确性和性能,今天把Python生成随机数组的方法稍作总结,以备以后查看使用。 一、使用random模
2022-06-04

c语言如何生成不重复的随机数

在C语言中,可以使用以下步骤生成不重复的随机数:1. 引入头文件 `stdlib.h` 和 `time.h`。```c#include #include ```2. 在程序的开始处使用 `srand` 函数初始化随机数种子,以确保每次运行程
2023-08-11

java生成随机数的三种方法

随机数有三种生成方式:1、通过Math.random()方法2、通过System.currentTimeMillis()方法获取毫秒数3、通过Random类第一种:常用方法Math.random()方法,是获取0-1之间的double类型的小数,在通过int类
java生成随机数的三种方法
2014-08-11

使用java怎么实现每次生成不重复的随机数

使用java怎么实现每次生成不重复的随机数?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录