5.math类

常用的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) 小数 需要整数范围、种子、多种类型随机数
密码学安全 否 否

示例

  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
  1. 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。

相关推荐
软件技术NINI33 分钟前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
Flynn Liang1 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
噢,我明白了2 小时前
JAVA中的一些基础应用知识点
java·开发语言
SL_staff3 小时前
私有化低代码不是妥协,而是企业级数字化的自主可控主航道
java
装不满的克莱因瓶3 小时前
【SpringAI Alibaba】ReactAgent结构化输出OutputType与OutputSchema实战
java·人工智能·ai·springai·springaialibaba
时间的拾荒人3 小时前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
秋天的怀念_David3 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
敲上瘾3 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
Java码农也是农3 小时前
Spring 事务详解:@Transactional 如何生效、何时回滚、传播行为怎么选
java·spring boot·spring·事务
学长毕设4 小时前
基于SpringBoot的游乐园管理系统-附源码
java·spring boot·后端