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

JAVA 随机函数

目录
  • 1. 日常开发(非安全场景):ThreadLocalRandom(推荐)
  • 2. 单线程/简单场景:Random
  • 3. 安全场景(如密码、Token生成):SecureRandom
  • 4. Java 8+ 流式处理:Random 结合流
  • 关键总结

在 Java 中生成随机数的“靠谱”实现,需要根据具体场景(如安全性、性能、随机性要求)选择合适的工具类。以下是几种常用方案及适用场景,按推荐优先级排序:

1. 日常开发(非安全场景):ThreadLocalRandom(推荐)

  • 优势:线程安全、高性能(避免线程竞争)、随机性良好,专为多线程环境设计。
  • 适用场景:普通业务逻辑(如随机数生成、抽奖、随机排序等非加密场景)。
  • 使用示例
    import java.util.concurrent.ThreadLocalRandom;public class RandomExample {public static void main(String[] args) {// 获取当前线程的随机数实例ThreadLocalRandom random = ThreadLocalRandom.current();// 生成 [0, 100) 之间的整数int intVal = random.nextInt(100);// 生成 [5, 10] 之间的整数int rangeVal = random.nextInt(5, 11);// 生成随机布尔值boolean boolVal = random.nextBoolean();// 生成 [0.0, 1.0) 之间的doubledouble doubleVal = random.nextDouble();}
    }
    

2. 单线程/简单场景:Random

  • 优势:API 简单,适合单线程或低并发场景。
  • 注意:多线程环境下使用同一个 Random 实例会导致竞争,性能下降,且可能降低随机性。
  • 使用示例
    import java.util.Random;public class RandomExample {public static void main(String[] args) {Random random = new Random();int intVal = random.nextInt(100); // [0, 100)long longVal = random.nextLong();float floatVal = random.nextFloat(); // [0.0f, 1.0f)}
    }
    

3. 安全场景(如密码、Token生成):SecureRandom

  • 优势:加密级随机性,通过系统熵源(如 /dev/random)生成,适合需要高安全性的场景(如生成密钥、验证码、令牌等)。
  • 注意:性能较低(熵源获取可能阻塞),非安全场景不建议使用。
  • 使用示例
    import java.security.SecureRandom;public class SecureRandomExample {public static void main(String[] args) {SecureRandom secureRandom = new SecureRandom();// 生成随机字节数组(常用于加密密钥)byte[] key = new byte[16];secureRandom.nextBytes(key);// 生成 [0, 100) 之间的安全整数int secureInt = secureRandom.nextInt(100);}
    }
    

4. Java 8+ 流式处理:Random 结合流

  • 适合批量生成随机数(如生成随机列表):
    import java.util.Random;
    import java.util.stream.IntStream;public class RandomStreamExample {public static void main(String[] args) {// 生成10个 [0, 100) 的随机整数并打印new Random().ints(10, 0, 100).forEach(System.out::println);}
    }
    

关键总结

  • 普通业务(多线程):优先用 ThreadLocalRandom(性能+线程安全最佳)。
  • 单线程简单场景Random 足够用。
  • 安全相关场景:必须用 SecureRandom(牺牲性能换安全性)。
  • 避免使用 Math.random()(本质是 Random 的静态实例,多线程下性能差,已被 ThreadLocalRandom 替代)。

根据场景选择即可,无需过度设计,但安全场景必须使用 SecureRandom 避免风险。

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

相关文章:

  • GPIO 也是一个接口,还有 QEMU GPIODEV 和 GUSE - 指南
  • Air780EPM系列低功耗模组USB设计进阶:硬件要点与LuatOS API开发赋能
  • 如何项目管理软件中计算预算?
  • Kimi会员双11砍价成功!0.99元首月链接分享
  • 实用指南:【Qt】9.信号和槽_信号和槽存在的意义
  • DI依赖注入
  • 解码LVGL定时器
  • ORACLE解析游标生成JSON
  • 习题解析之:鸡兔同笼
  • 如何选择锡林郭勒西林瓶灌装旋盖机?环境温湿度要求详解
  • DeepSeek权威测评榜单2025年11月最新geo优化公司推荐
  • ECB33-PGB2N4E32-I单板机智能交通监控应用方案解析
  • 北京GEO优化服务商2025权威推荐:抢占AI搜索流量新入口
  • 雅思报班哪个机构比较好?过来人分享选择经验与价格课程对比
  • 深入解析:第三方课题验收测试机构:【API测试工具Apifox使用指南】
  • 云原生周刊丨runc 三大高危漏洞曝光
  • Web Worker 入门指南
  • 鸿蒙NEXT系列之精析NDK UI API(节点增删和属性设置) - 实践
  • 通用cursor rules总结
  • 【JVS更新日志】开源框架升级vue 3、低代码、企业计划、智能BI及其他产品迎来新版本! - 实践
  • 银川西林瓶灌装旋盖机推荐2025,运行稳定连续8小时无故障
  • 【ACM出版 | EI检索稳定】2025年人工智能、业务转型和数据科学创新国际学术会议(ICBTDS 2025)
  • echarts 树形结构图实例
  • pg_hba.conf配置里peer,indent和md5的区别
  • 基于Simulink的双电机PID控制仿真实现方案
  • 锡林郭勒西林瓶灌装清洗耗材月成本分析?查行情享优惠
  • AI Agent OS 探索有价值的论文分析(1):Sleep-time Compute
  • Linux内核架构浅谈26-Linux实时进程调度:优先级反转与解决实用的方案
  • 宏定义的高级应用
  • 被问性能后,我封装了这个 PHP 错误上报工具