From cppreference.com
template<classRealType,std::size_tBits,classGenerator>RealTypegenerate_canonical(Generator&g);(since C++11)Generates a random floating point number in range [0, 1).
To generate enough entropy, generate_canonical() will call g() exactly k times, where k = max(1, ⌈ b / log2 R ⌉) and
b=std::min(Bits,std::size_t{std::numeric_limits<RealType>::digits}),
R=g.max()-g.min()+1.
Parameters
g - generator to use to acquire entropy Return value
Floating point value in range [0, 1).
Exceptions
None except from those thrown by g.
Notes
libstdc++ has correct behaviour as of GCC 16
libc++ may incorrectly occasionally return 1.0 (
)
vc++ avoids returning 1.0, but does so incorrectly by subtracting a small value instead of rerolling the generator (
).
For cases where the result is close to zero, only a fraction of the bits of entropy obtained should go into the result. The effect is that if all values generated less than, say, 0.001 are placed in a bucket, the number of different values that may appear would be many fewer than could be represented. Most implementations instead preserve as much of the obtained entropy as can be represented in the result.
Example
Produce random numbers with maximum randomness.
Run this code
#include<iostream>#include<random>intmain(){std::random_devicerd;std::mt19937gen(rd());for(intn=0;n<10;++n)std::cout<<std::generate_canonical<double,-1u>(gen)<<' ';std::cout<<'\n';}Possible output:
0.208143 0.824147 0.0278604 0.343183 0.0173263 0.864057 0.647037 0.539467 0.0583497 0.609219 See also