Current implementation: ```c wy2u01(uint64_t r){ const double _wynorm=1.0/(1ull<<52); return (r>>12)*_wynorm;} ``` I believe this should be `<<53` and `>>11` in order to get the highest number of possible results (while still being evenly spaced). See: - Daniel Lemire's blog: [How many floating-point numbers are in the interval [0,1]?](https://lemire.me/blog/2017/02/28/how-many-floating-point-numbers-are-in-the-interval-01/) - Taylor R Campbell: [Uniform random floats: How to generate a double-precision floating-point number in [0, 1] uniformly at random given a uniform random source of bits.](https://xoroshiro.di.unimi.it/random_real.c) - [hash4j's nextDouble implementation (Java)](https://github.com/dynatrace-oss/hash4j/blob/27e9a51607b496b63ed5117094bbd1be25a82924/src/main/java/com/dynatrace/hash4j/random/AbstractPseudoRandomGenerator.java#L46): `return (nextLong() >>> 11) * 0x1.0p-53;`