path: root/src/plugins
diff options
authorThiago Macieira <>2017-10-12 13:40:18 -0700
committerThiago Macieira <>2017-10-20 18:10:33 +0000
commitc90d9f95d27cf12747446ce8f7ee1cefe1f0f818 (patch)
treea76186af63dd1824234648a7143234ea389d9863 /src/plugins
parent68092ba6c0f26f679c0a9c086e13e44557b76b11 (diff)
QRandomGenerator: improve floating-point random generation
The previous version was good, just not optimal. Because the input was an unsigned 64-bit number, compilers needed to generate extra code to deal with HW instructions that only convert 64-bit signed input. And that was useless because a double uniformly distributed from 0 to 1 can only have 53 bits of randomness. The previous implementation did exactly what the Microsoft libstdc++ and libc++ implementations do. In my opinion, those implementations have an imperfect distribution, which is corrected in this commit. In those, all random input bigger than 0x20000000000000 has a different frequency compared to input below that mark. For example, both 0x20000000000000 and 0x20000000000001 produce the same result (4.8828125e-4). What's more, for the libc++ and MSVC implementations, input between 0xfffffffffffff001 and 0xffffffffffffffff results in 1.0 (probability 1 in 2⁵³), even though the Standard is very clear that the result should be strictly less than 1. GCC 7's libstdc++ doesn't have this issue, whereas the versions before would enter an infinite loop. Change-Id: Ib17dde1a1dbb49a7bba8fffd14eced3c375dd2ec Reviewed-by: Lars Knoll <> Reviewed-by: Edward Welbourne <>
Diffstat (limited to 'src/plugins')
0 files changed, 0 insertions, 0 deletions