diff --git a/src/java.base/share/classes/jdk/internal/util/random/RandomSupport.java b/src/java.base/share/classes/jdk/internal/util/random/RandomSupport.java index 99ca3da322d47..14fe0d3906df2 100644 --- a/src/java.base/share/classes/jdk/internal/util/random/RandomSupport.java +++ b/src/java.base/share/classes/jdk/internal/util/random/RandomSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -645,7 +645,7 @@ public static double boundedNextDouble(RandomGenerator rng, double origin, doubl if (origin < bound) { r = r * (bound - origin) + origin; if (r >= bound) // may need to correct a rounding problem - r = Math.nextAfter(r, origin); + r = Math.nextAfter(bound, origin); } return r; } diff --git a/test/jdk/java/util/Random/RandomNextDoubleBoundary.java b/test/jdk/java/util/Random/RandomNextDoubleBoundary.java index 511f251aed6ef..971b22d55c14d 100644 --- a/test/jdk/java/util/Random/RandomNextDoubleBoundary.java +++ b/test/jdk/java/util/Random/RandomNextDoubleBoundary.java @@ -24,13 +24,19 @@ /* * @test * @summary Verify nextDouble stays within range - * @bug 8280550 + * @bug 8280550 8280950 */ import java.util.SplittableRandom; +import java.util.random.RandomGenerator; public class RandomNextDoubleBoundary { public static void main(String... args) { + negativeBounds(); + positiveBounds(); + } + + private static void negativeBounds() { // Both bounds are negative double lowerBound = -1.0000000000000002; double upperBound = -1.0; @@ -49,4 +55,37 @@ public static void main(String... args) { throw new RuntimeException("Less than lower bound"); } } + + private static void positiveBounds() { + double[][] originAndBounds = {{10, 100}, + {12345, 123456}, + {5432167.234, 54321678.1238}}; + for (double[] originAndBound : originAndBounds) { + nextDoublesWithRange(originAndBound[0], originAndBound[1]); + } + } + + public static void nextDoublesWithRange(double origin, double bound) { + RandomGenerator rg = new RandomGenerator() { + @Override + public double nextDouble() { + return Double.MAX_VALUE; + } + + @Override + public long nextLong() { + return 0; + } + }; + double value = rg.nextDouble(origin, bound); + + assertTrue(value >= origin); + assertTrue(value < bound); + } + + public static void assertTrue(boolean condition) { + if (!condition) { + throw new AssertionError(); + } + } }