Java 随机数生成:从青铜到王者的骚操作指南 🎲✨
听说同事还在用抛硬币生成随机数?🤯 今天咱就把 Java 随机数整得明明白白,保证你写完代码同事直呼"666"!
壹:底层小弟 - Math.random() 🧙♂️
基础操作(幼儿园级别)
java
System.out.print("请输入最小值min: ");
int min = scanner.nextInt(); // 别输错哦,不然程序原地爆炸💥
System.out.print("请输入最大值max: ");
int max = scanner.nextInt();
// 核心魔法在此 ✨
int randomNum = (int)(Math.random() * (max - min + 1)) + min;
System.out.println("生成的随机数: " + randomNum);
为什么加 1?(灵魂拷问 ❓)
情况 | 算式 | 结果范围 | 包含最大值? |
---|---|---|---|
✘ 不加 1 | (int)(Math.random()* 3) + 2 | {2,3,4} | ❌ 永远得不到 5 |
✅ 加 1 | (int)(Math.random()* 4) + 2 | {2,3,4,5} | ✔️ |
举个栗子 🌰:

贰:进阶大佬 - Random 类 🦸♂️
装 X 必备单例模式
java
Random rand = new Random(); // 从此告别Math.random!
int randomNum = rand.nextInt(max - min + 1) + min;
Random VS Math.random
特性 | Random 类 | Math.random |
---|---|---|
线程安全 | ❌ 单挑王 | ❌ 脆皮鸡 |
使用便利度 | ✅ | 🤏 需要运算 |
专业度 | ⭐⭐⭐⭐ | ⭐⭐ |
自定义种子 | ✔️ 可控命运 | ❌ 听天由命 |
叁:王者专属 - ThreadLocalRandom 🏆
多线程杀手锏
java
// 高端玩家直接抄作业(高并发场景必备):
int randomNum = ThreadLocalRandom.current()
.nextInt(min, max + 1); // 注意max要+1!
💡 真相:多线程用普通 Random 比蜗牛还慢 🐌,ThreadLocalRandom 才是真香!
肆:安全专家 - SecureRandom 🔐
java
// 银行级安全防护
SecureRandom sr = new SecureRandom(); // 安全到亲妈都不认识
int randomNum = sr.nextInt(max - min + 1) + min;
四大神器对比表
类名 | 适用场景 | 性能 | 线程安全 | 代码骚度 |
---|---|---|---|---|
Math.random() |
新手村任务 | ⭐⭐ | ❌ | 🐣 |
Random |
单人副本 | ⭐⭐⭐ | ❌ | 🦸♂️ |
ThreadLocalRandom |
百人团战 | ⭐⭐⭐⭐ | ✅ | 🚀 |
SecureRandom |
银行金库 | ⭐⭐ | ✅ | 🔐 |
终极避坑指南 🚫🐛
- 范围陷阱 :永远记得
max-min+1
,别让最大值变路人!
java
// 错误示范:永远得不到max值!
int num = rand.nextInt(max - min) + min; ❌
// 正确姿势:+1是灵魂!
int num = rand.nextInt(max - min + 1) + min; ✅
- 多线程警告 :团队作战必用
ThreadLocalRandom
,否则队友变敌军 🤺
用普通Random处理多线程 ≈ 早高峰挤地铁🚇 → 轻则卡顿重则崩
- 安全警告 :验证码用
SecureRandom
,不然分分钟被爆破 💣
用普通Random处理验证码 ≈ 被人 hack 后 10 分钟 → 100 次失败尝试
- 种子玄学 :
setSeed()
要谨慎,乱设种子可能出规律值(别问我是怎么知道的 😭)
📢 重要通知:写完记得测试边界值!min=0 max=0 时程序不崩溃才叫专业 👨💻
下次产品经理说「加个随机功能」,请把这篇文章甩他脸上并说:
大人,时代变了! 💥