常用的math方法
1)abs 绝对值
2)pow 求幂
3)ceil 向上取整 // -1.8 -> -1.0, 4.5->5.0 返回>=该参数的最小整数(返回值double)
4)floor 向下取整 //-1.8 -> -2.0, 4.5->4.0 返回<=该参数的最大整数(返回值double)
5)round 四舍五入
6)sqrt 求开方
7)random 求随机数//思考:请写出获取a.b之间的一个随机整数b均为整数?
8)max求两个数的最大值
9)min求两个数的最小值
math.random 和 Random类
Math.random() 和 java.util.Random 都是伪随机数工具,但用途和灵活性不同。
核心区别
| 对比项 | Math.random() |
java.util.Random |
|---|---|---|
| 返回类型 | 只能返回 double,范围 [0.0, 1.0) |
可返回 int、long、double、boolean、float、Gaussian 等 |
| 使用方式 | 静态方法,直接调用 | 需要创建对象 |
| 底层实现 | Java 中内部使用一个共享的 Random 实例 |
自己维护随机数生成器状态 |
| 可控性 | 不能设置种子 | 可以 new Random(seed),结果可复现 |
| 线程安全 | 底层共享 Random,线程安全但高并发有竞争 |
Random 方法线程安全,但多线程竞争下性能一般 |
| 适用场景 | 简单生成 [0,1) 小数 |
需要整数范围、种子、多种类型随机数 |
| 密码学安全 | 否 | 否 |
示例
Math.random()
java
double d = Math.random(); // [0.0, 1.0)
int n = (int)(Math.random() * 10); // 0~9
生成 [min, max) 的整数:
java
int min = 5, max = 10;
int n = min + (int)(Math.random() * (max - min)); // 5~9
Random
java
import java.util.Random;
Random random = new Random();
int a = random.nextInt(); // 任意 int
int b = random.nextInt(10); // 0~9
double c = random.nextDouble(); // [0.0, 1.0)
boolean flag = random.nextBoolean();
生成 [min, max):
java
int min = 5, max = 10;
int n = random.nextInt(max - min) + min; // 5~9
设置种子,结果可复现:
java
Random r1 = new Random(123);
Random r2 = new Random(123);
System.out.println(r1.nextInt(100));
System.out.println(r2.nextInt(100)); // 相同
选择建议
- 只是要一个
[0,1)小数 :用Math.random()最简单。 - 需要整数范围、布尔值、种子、可复现结果 :用
Random。 - 多线程高并发 :优先用
ThreadLocalRandom。
java
import java.util.concurrent.ThreadLocalRandom;
int n = ThreadLocalRandom.current().nextInt(1, 100); // [1,100)
- 安全相关,如验证码、令牌、密码盐 :不要用这两个,使用
SecureRandom。
java
import java.security.SecureRandom;
SecureRandom secureRandom = new SecureRandom();
int n = secureRandom.nextInt(100);
总结
Math.random() 是"只能生成 [0,1) double 的便捷方法";Random 是"功能更完整、可控制种子的伪随机数类"。普通简单场景用 Math.random(),需要更多随机类型和范围控制时用 Random。