This is not an ordinary use of double-checked locking,
because Random is a thread-safe class.
I believe there is no way that data corruption can be observed,
even in theory. E.g. There is no way that
a NullPointerException can be observed.
The only bug I see is when multiple threads race to initialize
the randomNumberGenerator field. Multiple threads may create and
use a new Random, which is technically a violation of the spec,
but it is very hard to observe any effect of this defect.
If two threads call Math.random() at almost exactly the same time,
there is a greater than usual risk that they will get the same seed
(initialized from System.nanoTime()), which might not be random enough for