
Doug Gregor wrote:
I'm having a few problems dealing with uniform_real and uniform_01.
The basic issue is that uniform_real does not always produce values between its min and its max.
uniform_real was meant to be used with variate_generate<> only. Reviewing the language in the ISO C++ TR draft seems to miss one requirement: That the Engine used as input for uniform_real() always returns numbers in the range [0..1[, if floating-point numbers are requested. This is one of the features of variate_generate<>: it wraps the original Engine so that this is always the case. Note that the current ISO C++ TR draft already requires that the input Engine produce numbers of the "correct" type (floating-point or integer).
Looking at the source to uniform_real, the problem is obvious:
result_type operator()(Engine& eng) { return eng() * (_max - _min) + _min; }
Yes. Fixed.
However, uniform_01 is also broken in several ways:
uniform_01, at this time, is just an implementation helper for variate_generator<> and thus should move to the details namespace ASAP. Since it's hideously broken for general use right now, I'm inclined to perform the move without any deprecation period. Jens Maurer