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