当前位置: 首页 > news >正文

Java 随机生成6位数字

方法一:Random

每次创建新的 Random(线程安全,但效率低,不推荐)

例如:

public String generateCode() {Random random = new Random();return String.format("%06d", random.nextInt(1000000));
}

不会发生线程安全问题,因为每个线程都有自己的 Random 对象。

但是:

  • 每次都创建对象,效率较低。
  • 高并发下可能因为种子接近,随机性略差(现代 JDK 已优化很多,但仍不推荐)。

全局共享一个 Random(线程安全,但性能一般)

private static final Random RANDOM = new Random();public String generateCode() {return String.format("%06d", RANDOM.nextInt(1000000)); // 0 ~ 999999
}

java.util.Random 在现代 JDK 中是线程安全的(内部使用原子操作维护种子),不会因为多线程而产生错误。

但是:

  • 多线程竞争同一个 Random,性能会下降。
  • 并发越高,竞争越明显。
// 避免以 0 开头
RANDOM.nextInt(900000) + 100000;// 原理:
RANDOM.nextInt(900000); // 0 ~ 899999
+100000;                // 100000 ~ 999999

方法二:ThreadLocalRandom(推荐,并发性能最好)

public String generateCode() {// 验证码允许以 0 开头,比如 001234int code = ThreadLocalRandom.current().nextInt(1000000); // 0 ~ 999999return String.format("%06d", code);
}

每个线程都有自己的随机数状态,不需要加锁,没有竞争。

// 不以 0 开头
int code = ThreadLocalRandom.current().nextInt(100000, 1000000);
  • 100000:最小值(包含)
  • 1000000:最大值(不包含)
  • 保证一定是 6 位数字

推荐封装

如果是验证码生成,可以封装一个工具类:

import java.util.concurrent.ThreadLocalRandom;public class VerifyCodeUtil {/*** 生成6位数字验证码(允许前导0)*/public static String generate6Code() {return String.format("%06d",ThreadLocalRandom.current().nextInt(1_000_000));}/*** 生成6位数字(不允许前导0)*/public static int generate6Number() {return ThreadLocalRandom.current().nextInt(100000, 1000000);}public static void main(String[] args) {System.out.println(generate6Code());System.out.println(generate6Number());}
}

方法三:安全要求高,使用 SecureRandom

如果是:

  • 登录验证码
  • 短信验证码
  • 重置密码验证码
  • 支付验证码

更推荐:

private static final SecureRandom RANDOM = new SecureRandom();public String generateCode() {int code = RANDOM.nextInt(1_000_000);return String.format("%06d", code);
}

SecureRandom 使用密码学安全随机数,比 RandomThreadLocalRandom 更难预测,更适合安全场景。

http://www.jsqmd.com/news/1384733/

相关文章:

  • C语言连续输入问题:从缓冲区原理到实战解决方案
  • 02NylonME AI记忆引擎:你的 AI Agent 为什么总是交付不了?因为架构从一开始就错了
  • 寒地专网通信工程落地思考|扎根龙江,黑龙江移远科技本地化无线通信解决方案实践
  • AutoDock Vina分子对接教程:零基础完成第一次对接的6个关键步骤
  • OpenCore Legacy Patcher深度技术探索:内存注入机制与老Mac升级方案原理揭秘
  • 网盘直链解析工具终极指南:告别限速,释放下载潜能
  • 2026年工厂智能照明改造公司实力榜:上海凡特与五大主流品牌怎么选 - 品牌报告
  • 阿里云Elasticsearch日志采集与加工服务:一体化托管方案解析与实践
  • Shell脚本入门到实战:自动化运维与文本处理核心技巧
  • Qwen多模态工具层:本地AI智能体开发与部署实战指南
  • 2026年河北电梯无线五方对讲挑选攻略 鑫洋电子等企业梳理 - 小范同学a
  • 人力资源公司残保金怎么算?公式详解 - 天下观知
  • CentOS 7部署MinIO对象存储:从系统配置到服务优化的完整指南
  • 腾讯 WorkBuddy 实操:AI 数字员工工作台 + 一人公司 4.0(FDE)完整指南
  • 动态规划核心思想与实战:从斐波那契到背包问题
  • 抖音下载工具 douyin-downloader 上手指南:去水印、批量下载、增量备份一次讲清
  • SPT-AKI存档编辑器完全指南:5分钟掌握角色、商人、任务与技能的终极修改方案
  • 国风与赛博朋克风对比:使用知漫剧分析不同风格下AI漫剧怎么制作的跑图参数
  • Muse Glimmer 推测性解码实战:加速大模型推理的本地部署指南
  • 一招重置Windows更新组件:Reset Windows Update Tool让我摆脱0x80070002报错的纠缠
  • MySQL无符号整数深度解析:从二进制原理到实战选型指南
  • AI+3D人工智能全链路实战培训班2026年火热招生中 - 武汉学历升学规划
  • 从词向量到AI语义理解:揭秘“国王-男人+女人=女王”背后的向量运算原理与实践
  • 网站建设公司哪家好?2026年十大网站设计服务商深度评测 - 天下观知
  • Windows Cleaner终极指南:5步彻底解决C盘爆红问题的免费开源神器
  • B站视频下载工具完整教程:免费把大会员4K与充电视频保存到本地
  • 雅女湖摄影指南:黄金机位与曝光技巧
  • 从一键检测到 AI 修复:我们如何把无障碍检查做进研发流程
  • 智能体决策范式:ReAct与Plan-and-Solve深度对比与实战选型
  • Agent 输出带 Markdown 代码块?Prompt 约束 + 解析兜底解决 JSON 解析失败