首页 > 编程语言 >Java如何生成随机数?要不要了解一下!

Java如何生成随机数?要不要了解一下!

时间:2023-05-24 15:46:02浏览次数:65  
标签:Java Random bound 生成 nextInt 随机数

前言

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

一、Random类介绍

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

public class Random implements java.io.Serializable {}

Random 类提供了诸多方法,如下图:
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 进行了简单介绍,如果想深入了解,要查看其源码,去实操,去探究。

标签:Java,Random,bound,生成,nextInt,随机数
From: https://www.cnblogs.com/coding-rocket/p/17428509.html

相关文章

  • Java配置线程池
    一、Java配置线程池1、线程池分类、其他1.1、分类IO密集型和CPU密集型任务的特点不同,因此针对不同类型的任务,选择不同类型的线程池可以获得更好的性能表现。1.1.IO密集型任务​ IO密集型任务的特点是需要频繁读写磁盘、网络或者其他IO资源,执行时间长,CPU占用率较低。对......
  • 流程表单JavaScript代码
    ----订单流程-----------//表单加载初始化时functionpreinit(){}//表单加载完成,isrun代表流程是否流转中1-是,0-否functionLoaded(isrun){$("#om_order_status").attr("disabled","disabled");......
  • java入门2..0
    java的运行原理1.在本地磁盘中创建一个文本文件为Demo.java的源文件2.在源文件中编写java代码如下:publicclassDemopublicstaticvoid,main(String[]args){System.out.println(" ");}3.在当前文件目录下。输入cmd跳转到dos窗口4.通过java编译源文件。会生成字节码文件......
  • 剑指 Offer II 018(Java). 有效的回文(简单)
    题目:给定一个字符串s,验证s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。本题中,将空字符串定义为有效的 回文串 。 示例1:输入:s="Aman,aplan,acanal:Panama"输出:true解释:"amanaplanacanalpanama"是回文串示例2:输入:s="raceacar"......
  • 【JavaWeb-02】Web服务器
    文章目录2.web服务器2.1技术讲解2.2web服务器2.web服务器2.1技术讲解JSP/Servlet:B/S:浏览和服务器C/S:客户端和服务端sun公司主推的B/S架构基于Java语言的(所有的大公司,或者一些开源的组件,都是用Java写的)可以承载三高问题带来的影响2.2web服务器IIS:微软的Tmocat:Java初学人员......
  • 京东数科java一面【过】
    自我介绍实习经历【聊了挺多】集合方面Collection【list(写时复制)/set/Queue(阻塞队列)】Map【HashTable/HashMap/ConcorrentHashMap】synchronized对象头原理的过程A系统1WTBS,B系统300TBS,问解决方法技术角度:读写分离、Kong层、加服务器业务角度:加锁、加进度条AQS是什么原理Volat......
  • 阿里蚂蚁集团Java一面【凉】
    一个小哥哥打来的电话1.自我介绍2.介绍实习实习的时候用到了分布式锁深挖分布式锁的实现【回去复盘】遇到了什么问题?为什么用这个?怎么用的?怎么实现?3.多服务器之间是怎么保持数据一致的【回去复盘】4.分布式事务5.微服务了解嘛【回去复盘】6.MySQL的索引7.MySQL的乐观锁......
  • 【从Java转C#】第三章:对象和类型
    目录对象和类型ref和out参数的使用方法的重载属性构造函数匿名类型结构【Struct】弱引用(WeakReference)静态类Object对象和类型ref和out双方都可以改变原始的地址初始值的不同ref:需要赋予变量初始值out:不需要赋予变量初始值namespaceConsoleApp1{classProgram{......
  • Day02-关于java的基础知识
    关于java的基础知识java的特性和优势简单性面向对象可移植性高性能分布式动态性多线程安全性健壮性 JDK、JRE、JVMJDK:JavaDevelopmentkit(java开发工具)JRE:JavaRuntimeEnvironment(java运行时环境)JVM:JavaVirtualMachine(java虚拟机)......
  • 学习日记——初识Java
    1.什么是JavaJava的定义:一种程序编程语言,可以发布一系列有序指令来指挥机器工作Java的发展:1995年诞生,Java之父-高斯林Java目前应用比较多的版本:JavaSE7(2011年)JavaSE8(2014年)学习Java的原因:Java是高级编程语言,并且是很多领域的基础学科2.创建项目①Java环境配......