源本科技 | 码上会

Java 中的 Math.random() 方法

2025/12/25
22
0

生成伪随机数的基础工具


学习目标

  • 理解 Math.random() 的工作原理与返回值范围

  • 掌握如何使用 Math.random() 生成 0.0 到 1.0 之间的双精度浮点数

  • 学会将其转换为 指定范围内的整数(如 1~100)

  • 了解其适用场景与局限性

  • 对比 Math.random()java.util.Random 的区别


是什么

Math.random() 是 Java 中一个静态方法,用于生成伪随机双精度浮点数

基本特性

  • 返回类型double

  • 取值范围0.0 ≤ random < 1.0

    • 包含 0.0(可能返回)

    • 不包含 1.0(永远不会等于 1.0)

  • 无需创建对象:直接通过 Math.random() 调用

  • 内部实现:基于单例的 java.util.Random 实例

✅ 适用于简单场景,如游戏、教学示例、模拟等

不适用于加密、安全敏感场景


语法与返回值

public static double random()
  • 返回值:一个 double 类型的伪随机数,满足 0.0 <= value < 1.0


生成随机小数

class Main {
    public static void main(String[] args) {
        double value = Math.random();
        System.out.println("随机小数: " + value);
    }
}
随机小数: 0.4504830241585366

🔁 每次运行程序,输出结果都不同(因为未设置种子)


生成指定范围内的随机整数

要生成 [min, max] 范围内的整数(两端均包含),使用以下公式:

int randomInt = (int)(Math.random() * (max - min + 1)) + min;

原理解析

步骤

说明

Math.random()

生成 [0.0, 1.0) 的小数

* (max - min + 1)

缩放到 [0, range),其中 range = max - min + 1

(int) 强制转换

截断小数部分,得到 0range - 1 的整数

+ min

将结果平移到 [min, max] 区间

完整代码示例

生成 1~10 的随机整数(10 次)

class Main {
    public static void main(String[] args) {
        int min = 1;
        int max = 10;
        int range = max - min + 1;

        System.out.println("生成 10 个 1~10 之间的随机整数:");
        for (int i = 0; i < 10; i++) {
            int rand = (int)(Math.random() * range) + min;
            System.out.println(rand);
        }
    }
}

输出示例

生成 10 个 1~10 之间的随机整数:
8
3
10
2
5
4
4
7
5
6

✅ 注意:10 可能出现,说明 max包含在内的!


常见应用场景

数字猜谜游戏

int secretNumber = (int)(Math.random() * 100) + 1; // 1~100

随机选择选项

String[] options = {"石头", "剪刀", "布"};
int index = (int)(Math.random() * 3); // 0, 1, 2
System.out.println("电脑出:" + options[index]);

模拟概率事件

if (Math.random() < 0.3) {
    System.out.println("30% 概率事件触发!");
}

注意事项

问题

说明

非加密安全

生成的序列可预测,不能用于密码、令牌等安全场景

全局共享状态

所有调用共享同一个 Random 实例,多线程下性能略低

无法设置种子

不能重现相同的随机序列(调试困难)

精度有限

返回 53 位有效二进制位的双精度数

🔐 安全替代方案:java.security.SecureRandom

🛠 更灵活替代方案:java.util.Random(可设种子、生成多种类型)


替代方案对比

方式

优点

缺点

适用场景

Math.random()

简单、一行代码

无法设种子、仅返回 double

教学、简单游戏

new Random().nextInt(n)

灵活、可设种子、支持多种类型

需创建对象

一般应用开发

SecureRandom

加密安全、不可预测

性能较低

安全敏感场景(如 token 生成)

使用 Random 类的等效写法

import java.util.Random;

Random rand = new Random();
int number = rand.nextInt(100) + 1; // 1~100

重点总结

要点

说明

返回范围

0.0 <= x < 1.0(左闭右开)

生成整数公式

(int)(Math.random() * (max - min + 1)) + min

是否包含边界

minmax 都包含

线程安全

是(内部同步)

是否可重现

否(无法设置种子)

性能

适合轻量级使用


思考题

  1. 为什么 Math.random() * 100 的结果范围是 [0, 100),而 (int)(Math.random() * 100) 的结果是 099

  2. 如果想生成 -1010 之间的随机整数(包含两端),应如何编写表达式?

  3. 在多线程环境中频繁调用 Math.random() 是否会有性能瓶颈?为什么?

  4. 编写一个方法 rollDice(),模拟掷一个六面骰子(返回 1~6 的整数),使用 Math.random() 实现。