java中Math.random()和random()方法区别
在 Java 中生成随机数的核心工具是 java.lang.Math
类的 random()
方法和 java.util.Random
类,两者的底层公式和用法如下:
一、Math.random()
生成随机数(最常用)
Math.random()
是静态方法,直接返回 [0.0, 1.0)
区间的随机双精度小数(double 类型)。通过公式转换,可以生成任意范围的随机数。
通用公式(生成 [min, max)
区间的随机数):
// 生成 [min, max) 之间的随机整数(左闭右开)
int num = (int) (Math.random() * (max - min) + min);
- 参数说明:
max - min
:确定随机数的范围大小(差值)。Math.random() * (max - min)
:生成[0.0, max - min)
区间的小数。+ min
:将范围偏移到[min, max)
。(int)
:强制转换为整数(截断小数部分,实现整数随机数)。
常见场景示例:
生成
[0, 10)
之间的整数(0~9):int num = (int) (Math.random() * 10);
生成
[1, 100]
之间的整数(1~100,包含两端):int num = (int) (Math.random() * 100 + 1); // 等价于 [1, 101) → 1~100
生成
[5, 15]
之间的整数(5~15):int num = (int) (Math.random() * 11 + 5); // 15-5+1=11,范围 [5, 16) → 5~15
二、Random
类生成随机数(更灵活)
java.util.Random
类提供了更多方法(如生成整数、长整数、浮点数等),且支持指定种子(seed),适合需要可重复随机序列的场景。
基本用法:
import java.util.Random;Random random = new Random(); // 创建实例(无参构造:默认以系统时间为种子)
通用公式(生成 [min, max)
区间的随机数):
// 生成 [min, max) 之间的随机整数
int num = random.nextInt(max - min) + min;
- 说明:
random.nextInt(n)
直接返回[0, n)
区间的整数(无需强制转换)。- 其他步骤与
Math.random()
逻辑一致,通过偏移实现范围调整。
常见场景示例:
生成
[0, 10)
之间的整数(0~9):int num = random.nextInt(10);
生成
[1, 100]
之间的整数(1~100):int num = random.nextInt(100) + 1; // [0,100) +1 → [1,101) → 1~100
生成
[-5, 5]
之间的整数(-5~5):int num = random.nextInt(11) - 5; // [0,11) -5 → [-5,6) → -5~5
三、两种方式的区别
特性 | Math.random() | Random 类 |
---|---|---|
返回类型 | 仅返回 double([0.0, 1.0) ) | 提供 nextInt() 、nextLong() 等多种方法 |
种子控制 | 无法指定种子(内部依赖 Random ) | 可通过构造方法指定种子(new Random(seed) ),种子相同则随机序列相同 |
性能 | 单次调用略慢(需转换) | 多次调用更高效(直接生成整数) |
适用场景 | 简单随机数生成(如单次取值) | 复杂场景(如大量随机数、可重复序列) |
总结
- 简单场景优先用
Math.random()
,公式:(int)(Math.random() * 范围 + 最小值)
。 - 复杂场景(多类型、种子控制)用
Random
类,公式:random.nextInt(范围) + 最小值
。 - 范围计算核心:
范围 = max - min
(左闭右开区间),若需包含max
,则范围= max - min + 1
。