RFR: JDK-8273056 java.util.random does not correctly sample exponential or Gaussian distributions
Brian Burkhalter
bpb at openjdk.java.net
Tue Nov 30 21:56:10 UTC 2021
On Thu, 11 Nov 2021 13:59:51 GMT, Jim Laskey <jlaskey at openjdk.org> wrote:
> The modified ziggurat algorithm is not correctly implemented in `java.base/jdk/internal/util/random/RandomSupport.java`.
>
> Create a histogram of a million samples using 2000 uniform bins with the following range:
> Exponential range from 0 to 12. Gaussian range from -8 to 8.
>
> This does not pass a Chi-square test. If you look at the histogram it is obviously not showing the shape of the PDF for these distributions. Look closely at the range around zero (e.g. +/- 0.5).
Looks fine.
src/java.base/share/classes/jdk/internal/util/random/RandomSupport.java line 1191:
> 1189: // At this point, the high-order bits of U1 have not been used yet,
> 1190: // but we need the value in U1 to be positive.
> 1191: for (U1 = (U1 >>> 1);; U1 = (rng.nextLong() >>> 1)) {
A minor thing, but I would probably write `U1 >>>= 1` instead of `U1 = (U1 >>> 1)`.
-------------
Marked as reviewed by bpb (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/6353
More information about the core-libs-dev
mailing list