Andrei Alexandrescu wrote:
4. While we're at it, should uniform(a, b) generate by default something
in [a, b] or [a, b)? Someone once explained to me that generating [a, b]
for floating point numbers is the source of all evils and that Hitler,
Stalin and Kim Il Sung (should he still be alive) must be using that
kind of generator. Conversely, generating [a, b) is guaranteed to bring
in the long term everlasting peace to Earth. My problem however is that
in the integer realm I always want to generate [a, b]. Furthermore, I
wouldn't be happy if the shape of the interval was different for
integers and floating point numbers. How to break this conundrum? Don't
forget that we're only worrying about defaults, explicit generation is
always possible with self-explanatory code:
auto rng = Random(unpredictableSeed);
auto a = 0.0, b = 1.0;
auto x1 = uniform!("[]")(rng, a, b);
auto x2 = uniform!("[)")(rng, a, b);
auto x3 = uniform!("(]")(rng, a, b);
auto x4 = uniform!("()")(rng, a, b);
This is a general issue applying to any numeric range. I've been giving
the issue of numeric ranges some thought, and I have begun an
implementation of a general abstraction.
Any open range can be converted into a closed range, but the converse
does not apply. So any implementation will be using "[]" internally.
-range("[)", a, b) == range("(]", -b, -a)
range("[)", a, b) == range("[]", a, predecessor(b))
range("()", a, b) == range("[]", successor(a), predecessor(b))
There's a couple of difficult situations involving floating-point numbers.
* "[)" has the uncomfortable property that (-2,-1, rng) includes -2 but
not -1, whereas (1, 2, rng) includes 1 but not 2.
* any floating point range which includes 0 is difficult, because there
are so many numbers which are almost zero. The probability of getting a
zero for an 80-bit real is so small that you probably wouldn't encounter
it in your lifetime. I think this weakens arguments based on analogy
with the integer case.
However, it is much easier to make an unbiased rng for [1,2) than for
[1,2] or (1,2) (since the number of members in the range is even).