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

2023-10-27

1、Random类和Set集合来完成

Java实现生成n个不重复的随机数可以使用Java中的Random类和Set集合来完成

具体代码如下:

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

public class RandomNumberGenerator {

    public static Set<Integer> generateRandomNumbers(int n, int max) {
        if (n > max) {
            throw new IllegalArgumentException("n must be less than or equal to max");
        }

        Set<Integer> set = new HashSet<>();
        Random random = new Random();

        while (set.size() < n) {
            int num = random.nextInt(max) + 1;
            set.add(num);
        }

        return set;
    }

    public static void main(String[] args) {
        Set<Integer> set = generateRandomNumbers(5, 100);
        System.out.println(set);
    }
}

上述代码中,使用了一个while循环来生成n个不重复的随机数。在每次循环中,先生成一个范围在1到max之间的随机整数,然后将其加入Set集合中,由于Set集合不允许元素重复,所以会自动去重,直到包含n个元素为止。最后返回生成的随机数集合。

在main方法中,我们调用generateRandomNumbers方法来生成5个不重复的1到100之间的随机数,并使用System.out.println打印出来,输出结果类似于[4, 27, 52, 76, 97]

2、使用数组来存储生成的随机数

每次生成随机数之前判断数组中是否已经存在该数,如果存在就继续生成下一个随机数,直到生成了n个不重复的数为止

实现代码如下:

import java.util.Arrays;
import java.util.Random;

public class RandomNumberGenerator {

    public static int[] generateRandomNumbers(int n, int max) {
        if (n > max) {
            throw new IllegalArgumentException("n must be less than or equal to max");
        }

        int[] arr = new int[n];
        Random random = new Random();

        for (int i = 0; i < n; i++) {
            int num;
            do {
                num = random.nextInt(max) + 1;
            } while (contains(arr, num));
            arr[i] = num;
        }

        return arr;
    }

    private static boolean contains(int[] arr, int num) {
        for (int i : arr) {
            if (i == num) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[] arr = generateRandomNumbers(5, 100);
        System.out.println(Arrays.toString(arr));
    }
}

上述代码中,使用了一个for循环来生成n个不重复的随机数。在每次循环中,先生成一个范围在1到max之间的随机整数,然后调用contains方法来判断该数是否已经存在于数组中,如果不存在则加入数组。

在main方法中,我们调用generateRandomNumbers方法来生成5个不重复的1到100之间的随机数,并使用Arrays.toString打印出来,输出结果类似于[4, 27, 52, 76, 97]。

3、使用Fisher-Yates洗牌算法(也称为Knuth洗牌算法)

除了使用Random类和Set集合或数组来生成n个不重复的随机数,还可以使用Fisher-Yates洗牌算法(也称为Knuth洗牌算法)来实现。该算法的思路是:从原始数组中随机选择一个元素,将其与数组的第一个元素交换位置,然后从剩余的n-1个元素中随机选择一个元素,将其与数组的第二个元素交换位置,以此类推,直到遍历完所有的n个元素为止。

具体实现代码如下:

import java.util.Arrays;
import java.util.Random;

public class RandomNumberGenerator {

    public static int[] generateRandomNumbers(int n, int max) {
        if (n > max) {
            throw new IllegalArgumentException("n must be less than or equal to max");
        }

        int[] arr = new int[max];
        for (int i = 0; i < max; i++) {
            arr[i] = i + 1;
        }

        Random random = new Random();
        for (int i = max - 1; i >= max - n; i--) {
            int index = random.nextInt(i + 1);
            int temp = arr[index];
            arr[index] = arr[i];
            arr[i] = temp;
        }

        return Arrays.copyOfRange(arr, max - n, max);
    }

    public static void main(String[] args) {
        int[] arr = generateRandomNumbers(5, 100);
        System.out.println(Arrays.toString(arr));
    }
}

上述代码中,首先创建一个包含1到max的整数数组arr,然后使用Fisher-Yates洗牌算法来随机打乱数组中的元素,最后返回数组中的后n个元素。

在main方法中,我们调用generateRandomNumbers方法来生成5个不重复的1到100之间的随机数,并使用Arrays.toString打印出来,输出结果类似于[4, 27, 52, 76, 97]。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • JNA - EnumProcessModules() 未返回所有 DLL?

    我试图从游戏中读取坐标 当我在通过 OpenProcess 接收的 HANDLE 上使用 ReadProcessMemory 以及我在 CheatEngine 中找到的内存时 效果非常好 例如 如果我知道正在运行的进程中的浮点值是0x5AB
  • Java 字符串哈希码缓存

    字符串不变性的优点之一是哈希码缓存以实现更快的访问 在这种情况下 如何处理具有相同哈希码的字符串的缓存 在这种情况下它真的能提高性能吗 在这种情况下 如何处理具有相同哈希码的字符串的缓存 被缓存的是字符串的哈希码 它被缓存在私有的int字符
  • Java中RandomAccessFile的并发

    我正在创建一个RandomAccessFile对象通过多个线程写入文件 在 SSD 上 每个线程都尝试在文件中的特定位置写入直接字节缓冲区 并且我确保线程写入的位置不会与另一个线程重叠 file getChannel write buffe
  • Java Spark DataFrameReader java.lang.NegativeArraySizeException

    学习 Spark for java 并尝试阅读 csv文件为DataFrame使用DataFrameReader 甚至不能得到一个超级简单的 csv文件工作 因为我不断收到异常java lang NegativeArraySizeExcep
  • AffineTransform.rotate() - 如何同时缩放、旋转和缩放?

    我有以下代码 它可以完成我想要绘制一个上面有一些棋子的棋盘的 第一部分 Image pieceImage getImage currentPiece int pieceHeight pieceImage getHeight null dou
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • 我需要一个字数统计程序[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要弄清
  • net.sf.jasperreports.engine.JRRuntimeException:java.io.IOException:无法读取字体数据

    我正在尝试通过 JasperReport 创建 PDF 报告 但读取字体数据时出现问题 我有 jasperreports extension properties 和 ClassPath 中的相关 TTF 文件 这是错误 java io I
  • 如何使用 Selenium 中的索引切换到窗口

    由于selenium不提供切换到窗口 多个窗口 的方法 但我想使用index html自定义方法来切换到不同的窗口 但下面的代码没有按预期工作 请建议以下方法的最佳实施 public void switchToWindowIndex int
  • 如何在 JdbcTemplate 中创建 mySQL 存储过程

    背景 为了解决 MySql 中某些语句只允许在存储过程中出现的问题 我尝试在 JdbcTemplate 提交的 sql 中创建 运行然后删除存储过程 一个简单的例子是 这恰好是在 Spring Boot 中 Service public c
  • 在 Java 中创建带注释的对象时收到通知

    Intent 我有一个自定义 Java 注释 DynamicField public class RESTEndpointInvoker DynamicField key httpTimeout private long httpTimeo
  • bufferedinputstream 中标记读取限制有什么用

    我是Java流的新手 我想读取特定的文件内容 然后需要从头开始读取 我创建了一个 BufferedInputStream 但我对 BufferedInputStream mark int markLimit 的文档感到困惑 文档说 publ
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • 更新分页。是否可以?

    他们是否存在一些方法来处理更新分页 例如我有 100 行类型 Id private Integer id Column private boolean flag Column private Date last 一开始它们看起来像 id f
  • 如何在速度模板中检索哈希图值

    如何从速度模板中的以下哈希图中检索值 请帮忙 LinkedHashMap
  • while 之后无法访问的语句[重复]

    这个问题在这里已经有答案了 我只是修改代码 在以下代码中出现错误 int x 1 System out println x x while true x System out println x x 错误在最后一行 我可以知道错误 错误 无
  • 如何使 JScrollPane 与嵌套 JPanel 一起正常工作?

    我正在使用 NetBeans 在 Java 中构建 Swing 应用程序 但我遇到布局问题 我的主框架包含一个JScrollPane其中包含一个JPanel called contentPanel其中又包含一个JPanel called l
  • Retrofit 2.0:预期为 BEGIN_OBJECT,但在第 1 行第 1 列路径 $ [重复] 处为 STRING

    这个问题在这里已经有答案了 我在邮递员上传递了更新用户请求并获得了成功的响应 参见图片 现在当我尝试使用 Retrofit 2 在我的应用程序中执行相同操作时 出现错误 com google gson JsonSyntaxException
  • 获取Java中ResultSet返回的行数

    我用过一个ResultSet返回一定数量的行 我的代码是这样的 ResultSet res getData if res next System out println No Data Found while res next code t
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • Java 的七种垃圾收集器

    了解 Java 中的内存管理 用 C 或 C 这样的编程语言写一个应用时 需要编写代码来销毁内存中不再需要的对象 当应用程序扩展得越来越复杂时 未使用对象被忽略释放的可能性就越大 这会导致内存泄露 最终内存耗尽 在某个时刻将没有更多的内存可
  • Qt串口通信接收数据不完整的解决方法

    在使用串口接收数据时 当数据量大的时候会出现数据接收不完整的情况 因为串口数据获取函数readAll 由readyRead 信号触发 但readyRead 信号在串口读到起始标志时立即发送 并不保证一定是当前所发数据的起始部分 因此串口通信
  • SpringBoot2.x 集成Activiti6.0

    任务要求 集成Activiti6 0 流程引擎开发环境 核心依赖pom文件如下
  • VIM列编辑

    有时候需要多行编辑 例如注释多行代码 或者取消注释 虽然有插件支持 但插件不能插入特殊的字符 此时可以借助vim的列编辑模式 可以允许同时编辑多行 具体的操作如下 在normal模式下按ctrl v进入列编辑模式 通过hjkl选中编辑的区域
  • Numpy数据类型对象(dtype)

    常用方法 记住引入numpy时要是用别名np 则所有的numpy字样都要替换 查询数值类型 gt gt gt type float dtype float64 查询字符代码 gt gt gt dtype f dtype float32 gt
  • 安装博途时一直提示重启电脑,如何操作?

    1 在安装博途时 一直要求重启电脑的提示 如下图所示 2 如果出现上图所以提示 需要进行如下操作 3 在电脑开始菜单里右击 选择运行 点击运行命令 会弹出如下图操作 4 删掉注册表的键值 如下图的位置 5 删掉上图所以键值后 再运行博途安装
  • 电子设计竞赛电源题(2)-检波与采样

    电赛中的电源题说好做也好做 说不好做也不好做 电源是一个危险的东西 硬件和软件稍有不慎可能就会炸板子炸芯片 在19年前的电赛电源题一般都是做开关电源逆变器之类的 但是这类题做的太多了 已经饱和了或者说现在的单纯的电源已经做的效率达到非常之高
  • UGUI中UI朝向某一个物体

    做一个上一剪头朝向下一箭头的效果 代码 Vector3 dir arrows i 1 transform position arrows i transform position dir z 0 dir Normalize arrows i
  • 如何解决技术难点

    1 可以从宏观方面处理 分解为小的demo 大处着眼 小处着手 2 分解为基本的技术 实现 3 切换一个电脑画图理解 画图有助于自己对整个流程分析 代码只是流程的实现 画图理解逻辑 保证自己有清晰的逻辑 清楚的思路和顺序 这点很重要 4 写
  • oracle hint之hint_index_ffs,index_join

    oracle hint index ffs index join index ffs hint 1 对表用快速索引全扫描进行访问 2 经测 仅count可以使用index ffs 而非count聚合函数好像不能使用index ffs SQL
  • 【IDEA】The IDE is running low on memory and this might affect performance. Please consider increasing

    今天在看Java源码 IDEA突然提示这个信息 The IDE is running low on memory and this might affect performance Please consider increasing av
  • Android 移动安全知识技术全解(加固技术、常规漏洞、Android 逆向......),移动安全问题不容忽视

    前言 您的设备是否处于遭受攻击 劫持或损害的风险中 毫无疑问 剑桥大学的研究人员发现 87 的 Android 智能手机有至少一个严重漏洞 Zimperium Labs 在早些时候发现 黑客只需通过一条简单的短信便能对 95 的 Andro
  • Let’s Make C++ Great Again——multiset与unordered_set

    文章目录 multiset 头文件 定义和插入元素 访问元素 遍历元素 删除元素 以下是一些常用的函数和用法 size empty 自定义排序方式 删除所有相同的元素 multiset和set有什么区别 元素唯一性 插入和删除 查找 uno
  • JVM垃圾回收与性能调优总结

    JVM垃圾回收与性能调优总结 JVM调优的几种策略 一 JVM内存模型及垃圾收集算法 1 根据Java虚拟机规范 JVM将内存划分为 New 年轻代 Tenured 年老代 永久代 Perm 其中New和Tenured属于堆内存 堆内存会从
  • 免费虚拟服务器注册,如何注册免费虚拟主机空间

    如何注册免费 目前能提供免费虚拟主机空间的服务商 非常少 即使有 也是各种限制 这里仅推荐几款比较熟知的品牌 OpenShift OpenShift空间是Red Hat的平台即服务的 但也存在着 PHP程序不兼容 国内访问速度慢 访问出现莫
  • 如何使用overleaf&LaTeX

    Introduction What is LaTeX LaTeX是一种基于 的排版系统 由美国计算机学家莱斯利 兰伯特 Leslie Lamport 在20世纪80年代初期开发 利用这种格式 即使使用者没有排版和程序设计的知识也可以充分发挥
  • Python: list列表的11个内置方法

    前言 在实际开发中 经常需要将一组 不只一个 数据存储起来 以便后边的代码使用 在VBA中有使用数组 可以把多个数据存储 到一起 通过数组下标可以访问数组中的每个元素 Python 中没有数组 但是加入了更加强大的列表 list 下面就对列
  • 从输入URL到浏览器显示页面到底经历了什么?

    文章目录 从输入URL到浏览器显示页面到底经历了什么 DNS解析 1 DNS解析过程 2 DNS优化 建立TCP连接 1 什么是TCP 2 TCP的连接建立 三次握手 3 为什么是三次握手 发送HTTP请求 1 请求行 2 HTTP缓存优化
  • Yii Framework 开发教程(29) Zii组件-Menu 示例

    介绍完Yii数据库接口外 从本篇开始介绍Zii组件 包括列表视图ListView 表格视图GridView 此外还包括一些基于JQuery的UI组件 如AutoComplete DataPicker Button Drag 和 Drop等
  • 用Java生成N个不重复的随机数,3种实例

    1 Random类和Set集合来完成 Java实现生成n个不重复的随机数可以使用Java中的Random类和Set集合来完成 具体代码如下 import java util HashSet import java util Random i