Random.nextBoolean()以50%概率返回true或false,基于next(1)生成0或1后映射,非浮点比较;线程不安全,多线程应使用ThreadLocalRandom.current().nextBoolean()或独立实例。

Random.nextBoolean() 是 Java 中最简单直接的随机布尔值生成方式,它内部基于 next(1)(即生成一个 1 位随机整数),返回 true 或 false 的概率严格为 50%。
它是怎么工作的
nextBoolean() 并不是靠 Math.random() < 0.5 这种浮点比较实现的,而是调用底层 next(1) 方法:
-
next(1)生成一个 0 到 1 之间的随机整数(只有 0 或 1) - 若结果为 0 → 返回
false;若为 1 → 返回true - 所以它是均匀分布、无偏、高效的布尔随机源
Random rand = new Random(); boolean b = rand.nextBoolean(); // 直接得到 true 或 false
如何确保线程安全
Random 实例本身不是线程安全的。多线程环境下,推荐以下任一方式:
- 每个线程使用独立的
Random实例(推荐) - 使用
ThreadLocalRandom.current().nextBoolean()(更轻量,专为多线程设计) - 避免共享同一个
Random实例并并发调用
// 推荐:多线程中用 ThreadLocalRandom boolean flag = ThreadLocalRandom.current().nextBoolean(); // 不推荐:多个线程共用一个 Random 实例 // Random shared = new Random(); // 可能导致性能下降或轻微偏差
能否控制 true/false 的概率?
nextBoolean() 固定是 50% 概率,不支持自定义权重。
如需非等概率(比如 70% true),需自行实现:
- 用
nextInt(100) < 70 - 或
nextDouble() < 0.7 - 或
nextFloat() < 0.7f
Random r = new Random(); boolean likelyTrue = r.nextInt(100) < 70; // 70% 概率为 true
替代方案对比
-
Math.random() < 0.5:可行但效率略低(涉及浮点运算和比较),且Math.random()是全局同步的,高并发下有竞争 -
new Random().nextBoolean():不推荐每次新建对象,开销大 -
SecureRandom.nextBoolean():适合安全敏感场景(如生成令牌开关),但性能远低于Random
总结:日常开发用 Random.nextBoolean() 最简洁可靠;多线程优先选 ThreadLocalRandom.current().nextBoolean();需要非均等概率就手动控制阈值。
立即学习“Java免费学习笔记(深入)”;


















