3.1 KiB
[rand.util.canonical]
29 Numerics library [numerics]
29.5 Random number generation [rand]
29.5.8 Utilities [rand.util]
29.5.8.2 Function template generate_canonical [rand.util.canonical]
template<class RealType, size_t digits, class URBG> RealType generate_canonical(URBG& g);
Let
r be numeric_limits::radix,
R be g.max()âg.min()+1,
d be the smaller of digits and numeric_limits::digits,245
k be the smallest integer such that Rkâ¥rd, and
x be âRk/rdâ.
An attempt is k invocations of g() to obtain values g0,â¦,gkâ1, respectively, and the calculation of a quantity S given by Formula 29.1:
S=kâ1âi=0(giâg.min())âRi(29.1)
Effects: Attempts are made until S<xrd.
[Note 1:
When R is a power of r, precisely one attempt is made.
â end note]
Returns: âS/xâ/rd.
[Note 2:
The return value c satisfies0â¤c<1.
â end note]
Throws: What and when g throws.
Complexity: Exactly k invocations of g per attempt.
[Note 3:
If the values gi produced by g are uniformly distributed, the instantiation's results are distributed as uniformly as possible.
Obtaining a value in this way can be a useful step in the process of transforming a value generated by a uniform random bit generator into a value that can be delivered by a random number distribution.
â end note]
[Note 4:
When R is a power of r, an implementation can avoid using an arithmetic type that is wider than the output when computing S.
â end note]
d is introduced to avoid any attempt to produce more bits of randomness than can be held in RealType.