Steven D'Aprano wrote:
On Tue, 09 Jun 2009 18:28:23 -0700, John Yeung wrote:

The docs are now... sort of correct.  For some values of a and b,
uniform() can never return b.  Notably, I believe uniform(0, 1) is
equivalent to random(), and will never return 1.  However, uniform(1, 2)
CAN return 2, if this is any indication:


a=0.0
b=1.0
a+(b-a)*z < b
True
a=1.0
b=2.0
a+(b-a)*z < b
False


But you haven't shown what value z has, so there's no way of interpreting that example.

I'd say that uniform(1, 2) should NOT return 2, at least for systems which round correctly. Given a random z such that:

0 <= z < 1

and two floats a, b such that:

a < b

(b is strictly the larger of the two) then:

0 <= z < 1

Multiply all sides by (b-a):
    0 <= (b-a)*z < (b-a)

Add a to all sides:
    a <= a + (b-a)*z < b


Hence uniform(a, b) should always return a result less than b, and greater or equal to a.

However, there is one proviso: floats are not reals. The above holds true for real numbers, but floats are subject to weird rounding effects. That means that there may be weird edge cases where Bad Things happen and things cancel catastrophically or round incorrectly.

A realistic edge case is that a + (b-a) doesn't always give b:

a = -1e90
b = 1.0
a < b
True
a + (b-a) == b
False
a + (b-a)
0.0


However, even in this case, it merely narrows the range of possible results, it doesn't widen it.


Did you try to find the edge case for z ? For the following, I'm using Python 2.6.2, running on XP, on a Pentium Core Duo.

I figure the highest theoretical value that random.random() should return is a number just under 1.0 The easiest way to generate that value is using the fromhex() method of float.

>>> z =      float.fromhex("0x1.fffffffffffffp-1")
>>> z
0.99999999999999989
>>> z<1.0
True
>>> z2 = 1.0 + z
>>> z2
2.0
>>> z2 < 2.0
False


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to