Consistent error messages for nextInRange test

Port modifications from sampling ContinuousSamplerParametricTest to the
ProvidersCommonParametricTest in core and simple modules.

Updated the precision of the chi-square critical value.

Add failed chi-square values to the message.

Format failed chi-square values to 3 decimal places.
diff --git a/commons-rng-core/src/test/java/org/apache/commons/rng/core/ProvidersCommonParametricTest.java b/commons-rng-core/src/test/java/org/apache/commons/rng/core/ProvidersCommonParametricTest.java
index 6935b90..4d3d3a0 100644
--- a/commons-rng-core/src/test/java/org/apache/commons/rng/core/ProvidersCommonParametricTest.java
+++ b/commons-rng-core/src/test/java/org/apache/commons/rng/core/ProvidersCommonParametricTest.java
@@ -20,7 +20,7 @@
 import java.util.List;
 import java.util.ArrayList;
 import java.util.concurrent.Callable;
-
+import java.util.stream.Collectors;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -498,21 +498,25 @@
         final int[] observed = new int[numBins];
         // Chi-square critical value with 9 degrees of freedom
         // and 1% significance level.
-        final double chi2CriticalValue = 21.67;
+        final double chi2CriticalValue = 21.665994333461924;
 
+        // For storing chi2 larger than the critical value.
+        final List<Double> failedStat = new ArrayList<>();
         try {
+            final int lastDecileIndex = numBins - 1;
             for (int i = 0; i < numTests; i++) {
                 Arrays.fill(observed, 0);
-                for (int j = 0; j < sampleSize; j++) {
+                SAMPLE: for (int j = 0; j < sampleSize; j++) {
                     final long value = nextMethod.call().longValue();
                     Assertions.assertTrue(value >= 0 && value < n, "Range");
 
-                    for (int k = 0; k < numBins; k++) {
+                    for (int k = 0; k < lastDecileIndex; k++) {
                         if (value < binUpperBounds[k]) {
                             ++observed[k];
-                            break;
+                            continue SAMPLE;
                         }
                     }
+                    ++observed[lastDecileIndex];
                 }
 
                 // Compute chi-square.
@@ -524,6 +528,7 @@
 
                 // Statistics check.
                 if (chi2 > chi2CriticalValue) {
+                    failedStat.add(chi2);
                     ++numFailures;
                 }
             }
@@ -541,8 +546,12 @@
         // 12    0.00190
 
         if (numFailures > 11) { // Test will fail with 0.5% probability
-            Assertions.fail(generator + ": Too many failures for n = " + n +
-                            " (" + numFailures + " out of " + numTests + " tests failed)");
+            Assertions.fail(String.format(
+                "%s: Too many failures for n = %d, sample size = %d " +
+                "(%d out of %d tests failed, chi2 > %.3f=%s)",
+                generator, n, sampleSize, numFailures, numTests, chi2CriticalValue,
+                failedStat.stream().map(d -> String.format("%.3f", d))
+                          .collect(Collectors.joining(", ", "[", "]"))));
         }
     }
 
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousSamplerParametricTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousSamplerParametricTest.java
index baa528f..751210f 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousSamplerParametricTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousSamplerParametricTest.java
@@ -18,6 +18,7 @@
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 import java.util.ArrayList;
 
 import org.junit.jupiter.api.Assertions;
@@ -114,9 +115,10 @@
         if (numFailures > 3) { // Test will fail with 0.16% probability
             Assertions.fail(String.format(
                     "%s: Too many failures for sample size = %d " +
-                    " (%d out of %d tests failed, chi2 > %.3f=%s)",
+                    "(%d out of %d tests failed, chi2 > %.3f=%s)",
                     sampler, sampleSize, numFailures, numTests, chi2CriticalValue,
-                    Arrays.toString(failedStat.toArray(new Double[0]))));
+                    failedStat.stream().map(d -> String.format("%.3f", d))
+                              .collect(Collectors.joining(", ", "[", "]"))));
         }
     }
 }
diff --git a/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/ProvidersCommonParametricTest.java b/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/ProvidersCommonParametricTest.java
index c4d95cc..55c6070 100644
--- a/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/ProvidersCommonParametricTest.java
+++ b/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/ProvidersCommonParametricTest.java
@@ -20,6 +20,7 @@
 import java.util.List;
 import java.util.ArrayList;
 import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
 import java.io.IOException;
 import java.io.ObjectOutputStream;
 import java.io.ObjectInputStream;
@@ -440,21 +441,25 @@
         final int[] observed = new int[numBins];
         // Chi-square critical value with 9 degrees of freedom
         // and 1% significance level.
-        final double chi2CriticalValue = 21.67;
+        final double chi2CriticalValue = 21.665994333461924;
 
+        // For storing chi2 larger than the critical value.
+        final List<Double> failedStat = new ArrayList<>();
         try {
+            final int lastDecileIndex = numBins - 1;
             for (int i = 0; i < numTests; i++) {
                 Arrays.fill(observed, 0);
-                for (int j = 0; j < sampleSize; j++) {
+                SAMPLE: for (int j = 0; j < sampleSize; j++) {
                     final long value = nextMethod.call().longValue();
                     Assertions.assertTrue(value >= 0 && value < n, "Range");
 
-                    for (int k = 0; k < numBins; k++) {
+                    for (int k = 0; k < lastDecileIndex; k++) {
                         if (value < binUpperBounds[k]) {
                             ++observed[k];
-                            break;
+                            continue SAMPLE;
                         }
                     }
+                    ++observed[lastDecileIndex];
                 }
 
                 // Compute chi-square.
@@ -466,6 +471,7 @@
 
                 // Statistics check.
                 if (chi2 > chi2CriticalValue) {
+                    failedStat.add(chi2);
                     ++numFailures;
                 }
             }
@@ -483,8 +489,12 @@
         // 12    0.00190
 
         if (numFailures > 11) { // Test will fail with 0.5% probability
-            Assertions.fail(generator + ": Too many failures for n = " + n +
-                            " (" + numFailures + " out of " + numTests + " tests failed)");
+            Assertions.fail(String.format(
+                    "%s: Too many failures for n = %d, sample size = %d " +
+                    "(%d out of %d tests failed, chi2 > %.3f=%s)",
+                    generator, n, sampleSize, numFailures, numTests, chi2CriticalValue,
+                    failedStat.stream().map(d -> String.format("%.3f", d))
+                              .collect(Collectors.joining(", ", "[", "]"))));
         }
     }