Andrei Alexandrescu wrote:
Steve Schveighoffer wrote:
4. While we're at it, should uniform(a, b) generate by default something
in [a, b] or [a, b)?

[a,b)

Every other piece of range-like code is zero based, and excludes the upper bound. This should be no different. It makes the code simpler too.

I tried both versions, and it turns out my code is almost never simpler with open integral intervals. Most of the time I need something like:

auto x = uniform(rng, -100, 100);
auto y = uniform(rng, 0, 100);

and I need to remember to actually ask for 101 instead of 100. True, when you want a random index in an array, open intervals are more convenient.

One purity-based argument is that in a random number you may actually ask for the total range:

auto big = uniform(rng, uint.max / 2, uint.max);

If the interval is open I can't generate uint.max.

Anyway, I checked the C++ API and it turns out they use closed intervals for integers and open intervals for reals. I know there's been a lot of expert scrutiny there, so I suppose I better copy their design.


Andrei

Maybe a NumericInterval struct would be a good idea. It could be specialized to any numeric type (float, double, int, etc), it would know its own boundaries, and it'd keep track of whether those boundaries were open or closed.

The random functions would take an RND and an interval (with some reasonable default intervals for common tasks like choosing elements from arrays and random-access ranges).

I have a Java implementation around here somewhere that I could port to D if anyone is interested.

--benji

Reply via email to