首页 > 编程语言 >Java如何获取随机数

Java如何获取随机数

时间:2024-10-30 15:47:20浏览次数:3  
标签:random Java ThreadLocalRandom int Random 生成 获取 随机数

引言

1. java.util.Random 类

1.1 基本用法

1.2 优点

1.3 缺点

2. Math.random() 方法

2.1 基本用法

2.2 优点

2.3 缺点

3. ThreadLocalRandom 类

3.1 基本用法

3.2 优点

3.3 缺点

4. 应用场景

5. 总结


引言

在Java编程中,生成随机数是一个常见的需求,无论是用于模拟、测试还是实际应用。Java提供了多种方法来生成随机数,包括使用java.util.Random类、Math.random()方法以及ThreadLocalRandom类。

1. java.util.Random 类

java.util.Random 是Java标准库中用于生成伪随机数的主要类。它基于线性同余生成器(Linear Congruential Generator, LCG)算法实现。

1.1 基本用法
import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        Random random = new Random();
        
        // 生成一个int类型的随机数
        int randomInt = random.nextInt();
        System.out.println("Random int: " + randomInt);
        
        // 生成一个在指定范围内的int类型的随机数
        int randomIntInRange = random.nextInt(100); // 生成0到99之间的随机数
        System.out.println("Random int in range [0, 99]: " + randomIntInRange);
        
        // 生成一个double类型的随机数
        double randomDouble = random.nextDouble();
        System.out.println("Random double: " + randomDouble);
        
        // 生成一个boolean类型的随机值
        boolean randomBoolean = random.nextBoolean();
        System.out.println("Random boolean: " + randomBoolean);
    }
}
1.2 优点
  • 灵活性:支持生成多种类型的随机数,包括整数、浮点数和布尔值。
  • 可重复性:通过设置相同的种子(seed),可以生成相同的随机数序列,适用于需要重现相同结果的测试场景。
1.3 缺点
  • 线程安全问题:多个线程共享同一个 Random 实例时可能会出现线程安全问题,建议每个线程使用独立的 Random 实例。
2. Math.random() 方法

Math.random() 是一个静态方法,返回一个在 [0.0, 1.0) 范围内的 double 类型随机数。它是 java.util.Random 的简化版本。

2.1 基本用法
public class MathRandomExample {
    public static void main(String[] args) {
        // 生成一个在 [0.0, 1.0) 范围内的随机数
        double randomDouble = Math.random();
        System.out.println("Random double: " + randomDouble);
        
        // 生成一个在指定范围内的int类型的随机数
        int randomIntInRange = (int) (Math.random() * 100); // 生成0到99之间的随机数
        System.out.println("Random int in range [0, 99]: " + randomIntInRange);
    }
}
2.2 优点
  • 简单易用:无需创建实例,直接调用即可。
  • 线程安全Math.random() 是线程安全的,因为它内部使用了 AtomicLong 来生成随机数。
2.3 缺点
  • 功能有限:只能生成 double 类型的随机数,如果需要其他类型的随机数,需要手动转换。
  • 不可设置种子:无法通过设置种子来生成相同的随机数序列。
3. ThreadLocalRandom 类

ThreadLocalRandomjava.util.concurrent.ThreadLocalRandom 类,专为多线程环境设计,避免了 Random 类中的线程安全问题。

3.1 基本用法
import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomExample {
    public static void main(String[] args) {
        // 生成一个int类型的随机数
        int randomInt = ThreadLocalRandom.current().nextInt();
        System.out.println("Random int: " + randomInt);
        
        // 生成一个在指定范围内的int类型的随机数
        int randomIntInRange = ThreadLocalRandom.current().nextInt(0, 100); // 生成0到99之间的随机数
        System.out.println("Random int in range [0, 99]: " + randomIntInRange);
        
        // 生成一个double类型的随机数
        double randomDouble = ThreadLocalRandom.current().nextDouble();
        System.out.println("Random double: " + randomDouble);
        
        // 生成一个long类型的随机数
        long randomLong = ThreadLocalRandom.current().nextLong();
        System.out.println("Random long: " + randomLong);
    }
}
3.2 优点
  • 线程安全:每个线程拥有独立的随机数生成器实例,避免了线程间的竞争。
  • 高性能:在多线程环境中性能优于 Random 类。
3.3 缺点
  • 复杂性:相比 Math.random() 和 Random 类,使用 ThreadLocalRandom 稍微复杂一些。
  • 不可设置种子:无法通过设置种子来生成相同的随机数序列。
4. 应用场景
  • java.util.Random:适用于单线程环境或需要生成多种类型随机数的场景。
  • Math.random():适用于简单的随机数生成需求,特别是只需要 double 类型随机数的场景。
  • ThreadLocalRandom:适用于多线程环境,特别是在并发环境下需要高性能随机数生成的场景。
5. 总结

Java提供了多种方法来生成随机数,每种方法都有其特点和适用场景。选择合适的方法取决于具体的需求,例如是否需要线程安全、生成的随机数类型以及性能要求等。

标签:random,Java,ThreadLocalRandom,int,Random,生成,获取,随机数
From: https://blog.csdn.net/2401_85648342/article/details/143328491

相关文章

  • Java编程语言:从入门到精通
    Java是一种广泛使用的高级编程语言,由SunMicrosystems在1995年发布,后来被Oracle公司收购。Java以其“一次编写,到处运行”(WriteOnce,RunAnywhere)的理念而闻名,成为企业级应用开发、Android应用开发和大数据处理等领域的重要工具。二、Java的发展历程1991年:SunMicros......
  • 【JavaScript】之浏览器对象模型(BOM)详解
    浏览器对象模型(BOM:BrowserObjectModel)是JavaScript的一部分,它允许你与浏览器窗口进行交互。不同于DOM(文档对象模型)主要处理网页内容,BOM关注的是浏览器窗口本身及其各种特性,例如导航、窗口大小、浏览器历史记录等等。就是JavaScript将浏览器的各个组成部分封装成了对......
  • 【JavaEE】【多线程】定时器
    目录一、定时器简介1.1Timer类1.2使用案例二、实现简易定时器2.1MyTimerTask类2.2实现schedule方法2.3构造方法2.4总代码2.5测试一、定时器简介定时器:就相当于一个闹钟,当我们定的时间到了,那么就执行一些逻辑。1.1Timer类Java的标准库中提供了在java.ut......
  • JavaScript 实现对 JSON 对象数组数据进行分页处理
    JavaScript实现对JSON对象数组数据进行分页处理在前端JavaScript中对JSON对象数组进行分页,可以通过以下方式实现:分页函数示例代码假设有一组JSON对象数据,比如一组用户信息:constdata=[{id:1,name:"Alice"},{id:2,name:"Bob"},{id:3,name:"......
  • Quick Action获取recordId 与 objectApiName的问题
    在QuickAction中引用lwc组件时,recordId与objectApiName会undefined,但html页面中用到recordId的地方能正常使用,在connectedCallback中打印recordId却找不到,因为在QuickAction中获取recordId,与connectedCallback并非顺序执行,通常在调用connectdCallback后填充。如果想在QuickAct......
  • Java中常用的监控命令
    Java提供了多种监控工具,这些工具包含了许多命令行工具,用于监控、诊断和管理Java应用程序的性能。这些工具主要位于Java安装目录下的bin文件夹中,以下是几个常用的Java自带监控命令的详细说明:1.jps(JavaVirtualMachineProcessStatusTool)用于列出当前运行的......
  • 基于Java+SpringBoot+Vue的课程答疑系统
    基于Java+SpringBoot+Vue的课程答疑系统前言✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • windows java8的环境的安装
    目录下载地址安装过程下载地址官网下载地址:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html通过百度网盘分享的文件:jdk-8u321-windows-x64.exe链接:https://pan.baidu.com/s/1Va5kC78upY-gfyiMRL_aEQ?pwd=fe2e提取码:fe2e安装过......
  • 惊了!大模型连这样的验证码都能读懂_java_识别验证码
    最近在看视觉大模型的能力,然后用了某网站的一个验证码试了试,竟然连这样的验证码都能认识,这个有点夸张,尤其是这个9和6颠倒的都能理解,现在的能力已经这么牛了么具体就是用了通义最新的qwenvl模型+springaialibaba。这个识别能力和理解能力,绝对能处理非常多的不同类型的......
  • Java & Lock & AQS & 总结
    前言 相关系列《Java&Lock&目录》(持续更新)《Java&Lock&AQS&源码》(学习过程/多有漏误/仅作参考/不再更新)《Java&Lock&AQS&总结》(学习总结/最新最准/持续更新)《Java&Lock&AQS&问题》(学习解答/持续更新)  涉及内容《Java&Lock&ReentrantLock......