【Java】Java如何生成随机数?

news2024/11/23 15:37:06

文章目录

  • 前言
  • 一、Random类介绍
  • 二、Random类生成随机数
    • 1.生成随机数
    • 2.nextInt()方法
  • 三、使用场景
  • 四、官方提示
  • 总结

前言

我们在学习 Java 基础时就知道可以生成随机数,可以为我们枯燥的学习增加那么一丢丢的乐趣。本文就来介绍 Java 随机数。

一、Random类介绍

在 Java 中使用 Random 工具类来生成随机数,该类在 java.util 包下,在 JDK1.0 版本就存在了。Random 单词本身就是随机、随意、任意的意思。Random 是一个普通类,所以在使用时需要创建 Random 对象,在调用其提供的方法。

public class Random implements java.io.Serializable {}

Random 类提供了诸多方法,如下图:
在这里插入图片描述

二、Random类生成随机数

1.生成随机数

在 Java 中,可以使用 java.util.Random 类来生成随机数。 Random 类提供了多个方法来生成不同种类的随机数,例如 nextInt()、nextDouble() 等。
我们这里演示如何生成一个介于0到9之间的随机整数:

import java.util.Random;

public class RandomTest {
    public static void main(String[] args) {
        // 创建Random实例
        Random random = new Random();
        // 生成0到9之间的随机数
        int randomNum = random.nextInt(10); 
        System.out.println(randomNum);
    }
}

在上面的示例代码中,首先创建了一个 Random 对象,然后使用 nextInt() 方法生成一个介于0到9之间的随机整数,并将结果打印到控制台上。

2.nextInt()方法

nextInt(int bound) 方法是 Random 类的一个实例方法,它用于生成一个介于0(包括0)和指定值(不包括该值)之间的随机整数。
我们之前使用 nextInt(int bound) 方法生成 0-9 之间的随机数:

Random random = new Random();
int randomNum = random.nextInt(10);
System.out.println(randomNum);

代码中使用 Random 类的默认构造函数创建一个随机数生成器对象,然后调用 nextInt(int bound) 方法生成介于 0(包括 0)和 10(不包括 10)之间的随机整数(多次提及且加粗),最后将结果存储到 randomNum 变量中并打印到控制台上。

这个方法的实现原理是根据随机数生成器的内部状态生成随机数。如果指定的 bound 参数是正数,则生成的随机数即为 0 到 bound 之间的某个整数。如果 bound 是负数或者 0,则会抛出 IllegalArgumentException 异常。需要注意的是,生成的随机数是伪随机数,其实际上是一个确定性的函数,但是它的表现看上去是随机的。

对于 Random.nextInt(int bound) 方法,需要特别注意 bound 参数的取值范围。如果生成的随机数不是 0 到 bound 之间,那么就可能会对一些应用产生负面影响,比如在密码学应用中可能会导致漏洞。因此,在使用该方法时,需要仔细检查 bound 参数的取值范围,并对其进行适当的限制。
那么除了 nextInt() 方法,还有 nextLong()、nextBoolean()、nextFloat()、nextDouble() 等。

三、使用场景

Java 随机数生成器可以在很多场景下使用,比如在游戏开发中,可以随机生成怪物、地图、道具等;如果涉及密码,可以在加密过程中需要生成随机数,如在生成密钥的时候生成长度随机的盐值;也可以进行测试和演练:可以使用随机数生成器来生产测试数据、观测数据等等;

总之,随机数的使用非常广泛,任何需要模拟随机的场景都可以使用 Java 提供的随机数生成器生成随机数。

我们大都有选择困难症,比如不知道午饭吃什么?很头疼!那就让上天来决定吧!我们使用 Java 随机数来随意抽取或是决定午饭。

import java.util.Random;

public class RandomLunch {
    public static void main(String[] args) {
        String[] foods = {"汉堡", "炸鸡", "披萨", "烤肉", "牛肉面", "米线", "酸菜鱼", "煲仔饭", "火锅", "小笼包"}; //可以选择的午餐品种
        Random random = new Random();
        int index = random.nextInt(foods.length); // 生成0到可选菜品数量之间的一个随机整数
        String lunch = foods[index]; // 根据随机数选定菜品
        System.out.println("午饭吃" + lunch);
    }
}

上面的代码中,首先定义了一个数组中,存储了可以选择的午餐品种。然后使用 java.util.Random 类创建一个随机数生成器对象,使用 nextInt(int bound) 方法生成一个介于 0 和可选菜品数量之间的随机数。最后,使用这个随机数从菜品数组中选择一个菜品,将其存储到字符串变量 lunch 中,并输出午餐的选择结果。

在实际开发中,可以将类似的代码集成到提供菜品选择功能的系统中,方便办公室的小伙伴们快速决定午餐。

四、官方提示

java.util.Random 的实例是线程安全的。但是,跨线程并发使用同一个 java.util.Random 实例可能会遇到争用,从而导致性能下降。考虑在多线程设计中使用 java.util.concurrent.ThreadLocalRandom。
java.util.Random 的实例不是加密安全的。请考虑使用 java.security.SecureRandom 来获得加密安全的伪随机数生成器,以供对安全性敏感的应用程序使用。

总结

Java 随机数的使用场景还是很多的,所以我们要对其进行掌握,本文对 Java 生成随机数的类 Random 进行了简单介绍,如果想深入了解,要查看其源码,去实操,去探究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在CentOS7.9上安装最新版本Docker安装步骤

1、查看系统版本: cat /etc/redhat-release 2、卸载原有版本(如有的话) sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ d…

linux学习(文件描述符)[11]

一切皆文件 用代码创建的文件,默认路径在可执行文件同级目录下(本质是进程通过系统接口创建的) 文件宏 在Linux下,有一些与文件操作相关的宏可以用于处理文件描述符和文件权限。以下是一些常用的文件宏: STDIN_FIL…

算法通关村第4关【白银】| 栈的经典算法问题

1.括号匹配问题 思路:将左括号压入栈中,遍历字符串,当遇到右括号就出栈,判断是否是匹配的一对,不是就返回false(因为按照顺序所以当遇到右括号出栈一定要是匹配的)。使用Map来简化ifelse clas…

单片机中绝对地址转换为函数指针

一、相关概念 函数指针和指针函数是两个不同的概念。 函数指针是指可以指向函数的指针,它的类型与函数的返回值类型和参数类型相对应。通过函数指针,可以实现函数的回调和动态调用等功。 指针函数则是指返回指针类型的函数,它的返回值是一个指…

关于CDN加速和负载均衡技术的讨论

一:前言 相信学习到信息收集模块的小伙伴在学习Web信息收集中查找真实IP相关知识点时,必定接触到一个概念:CDN加速。那么什么是CDN?企业为什么要用CDN?就是为了隐藏自己的真实IP?显然不是。经济学中有一个概…

linux17 线程安全 线程同步

1、线程安全: 多线程程序无论调度顺序如何,都能保证程序 的正确性,就说该程序处于线程安全的状态 1)、同步 2)、线程安全函数//有的函数不适合多线程使用,是函数自身的原因。 2、线程安全函数 1&#…

java-垃圾回收与算法

垃圾回收与算法 1. 如何确定垃圾 1. 引用计数法 在 Java 中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用&…

【Freertos基础入门】任务调度

文章目录 前言对于前面博客的总结一、任务调度算法是什么?1.调度算法是什么以及freertos的调度算法2.抢占式优先级调度3.时间片轮转调度 二、配置调度算法总结 前言 本系列基于stm32系列单片机来使用freerots 任务管理是实时操作系统(RTOS)…

VS2015+mysql5.7升级到VS2019+mysql-8.0.34

本来一开始是安装的vs2022社区版,结果没找到mysql-for-visualstudio对应的2022的版本。 原来:VS2015mysql5.7 安装的插件: mysql-for-visualstudio-2.0.5.msi mysql-connector-net-6.10.8.msi 升级后:VS2019mysql-8.0.34 安…

深入理解linux内核--块设备驱动程序

块设备的处理 块设备驱动程序上的每个操作都涉及很多内核组件;其中最重要的一些如图14-1所示。 例如,我们假设一个进程在某个磁盘文件上发出一个read()系统调用 ——我们将会看到处理write请求本质上采用同样的方式。 下面是内核对进程请求给予回应的一…

FPGA芯片IO口上下拉电阻的使用

FPGA芯片IO口上下拉电阻的使用 为什么要设置上下拉电阻一、如何设置下拉电阻二、如何设置上拉电阻为什么要设置上下拉电阻 这里以高云FPGA的GW1N-UV2QN48C6/I5来举例,这个芯片的上电默认初始化阶段,引脚是弱上来模式,且模式固定不能通过软件的配置来改变。如下图所示: 上…

Openwrt指定延迟脚本

在某些情况下,我们需要对指定网络接口指定延迟,以达到我们想要实验的效果延迟。 脚本如下: #!/bin/bash # #初始化 tc qdisc del dev br-lan root echo "1. 添加延迟规则 2. 删除延迟规则" read -p "请选择操作:&q…

素数线性筛法 → 欧拉筛

【题目来源】https://www.acwing.com/problem/content/870/【题目描述】 给定一个正整数 n,请你求出 1∼n 中质数的个数。【输入格式】 共一行,包含整数 n。【输出格式】 共一行,包含一个整数,表示 1∼n 中质数的个数。【数据范围…

【数字实验室】时钟切换

大部分开发者使用 BUFGCTRL 或 BUFGMUX进行时钟切换,它们在时钟切换上可以提供无毛刺输出。然而,了解所涉及的原理是有好处的。 当然,无论我们在同步逻辑中使用哪种技术,重要的是要确保在进行时钟切换时输出上没有毛刺。任何故障都…

无涯教程-Perl - times函数

描述 此函数返回一个四元素列表,为当前进程及其子进程提供用户,系统,子进程和子系统时间。 语法 以下是此函数的简单语法- times返回值 此函数返回ARRAY,($usertime,$systemtime,$childsystem,$childuser) 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl -w($use…

一、ls 标准输出时出现乱码符号及解决办法

问题描述:采用 QSSh 登录远程主机时,执行 ls 指令,标准输出中出现乱码符号 如下,在成功 SSH 到远程主机后,执行 ls 指令,标准输出中出现一堆不认识的符号。 从标准输出来看,英文和中文并没有乱…

安科瑞无线测温产品在浙江某半导体项目的应用-安科瑞黄安南

摘 要:半导体被誉为“制造业的大脑”,在关系国家安全和国民经济命脉的主要行业和关键领域占据支配地位,是国民经济的重要支柱。随着数字技术的发展和数字经济在国民经济中所占比重越来越高,半导体产业的重要性还会进一步提升。安全…

文心一言 VS 讯飞星火 VS chatgpt (77)-- 算法导论7.3 2题

二、如果用go语言,在 RANDOMIZED-QUICKSORT 的运行过程中,在最坏情况下,随机数生成器 RANDOM 被调用了多少次?在最好情况下呢?以θ符号的形式给出你的答案? 文心一言: 在 RANDOMIZED-QUICKSORT 的运行过程中,最坏…

使用贝塞尔曲线算法制作曲线

一阶贝塞尔曲线 使用两个点绘制线段 p3p1(p2-p1)*t p1:起点;p2:终点;t:0-1;p3:线段L12上的点 两个点和t的变化(0-1)可得到一条线段 二阶贝塞尔曲线 使用三个点绘制曲线 p12p1(p2-p1)*t p23p2(p3-p2)*t p123p12(p23-p12)*t p12是线段L12上的点, p23是线段L23上的…

android:绘图 (android.graphics包)

android:绘图 View:组件,理解为画布 Drawable:所有可见对象的描述,理解为:素材类 Bitmap:图片类 Canvas:画笔 Paint:画笔样式与颜色、特效的集合 近期很多网友对Android用户界面的设计表示很感…