常用的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()
doubled=Math.random();// [0.0, 1.0)intn=(int)(Math.random()*10);// 0~9生成[min, max)的整数:
intmin=5,max=10;intn=min+(int)(Math.random()*(max-min));// 5~9Random
importjava.util.Random;Randomrandom=newRandom();inta=random.nextInt();// 任意 intintb=random.nextInt(10);// 0~9doublec=random.nextDouble();// [0.0, 1.0)booleanflag=random.nextBoolean();生成[min, max):
intmin=5,max=10;intn=random.nextInt(max-min)+min;// 5~9设置种子
计算机里的“随机数”通常是伪随机数:它不是真正随机,而是通过一个确定算法算出来的。
种子(seed)就是这个算法的初始状态。
- 不设置种子:通常用当前时间等信息作为种子,所以每次运行结果不同。
- 设置相同种子:每次运行都会得到完全相同的随机数序列。
- 设置不同种子:一般得到不同序列。
设置种子,结果可复现:
Randomr1=newRandom(123);//数字不一样只是代表不同的种子Randomr2=newRandom(123);//两个相同的种子,生成的数字一样System.out.println(r1.nextInt(100));System.out.println(r2.nextInt(100));// 相同选择建议
选择建议
- 只是要一个
[0,1)小数:用Math.random()最简单。 - 需要整数范围、布尔值、种子、可复现结果:用
Random。 - 多线程高并发:优先用
ThreadLocalRandom。
importjava.util.concurrent.ThreadLocalRandom;intn=ThreadLocalRandom.current().nextInt(1,100);// [1,100)- 安全相关,如验证码、令牌、密码盐:不要用这两个,使用
SecureRandom。
importjava.security.SecureRandom;SecureRandomsecureRandom=newSecureRandom();intn=secureRandom.nextInt(100);总结
Math.random()是“只能生成[0,1)double 的便捷方法”;Random是“功能更完整、可控制种子的伪随机数类”。普通简单场景用Math.random(),需要更多随机类型和范围控制时用Random。