[Python-checkins] python/dist/src/Lib random.py,1.63,1.64

rhettinger at users.sourceforge.net rhettinger at users.sourceforge.net
Tue Aug 31 03:05:18 CEST 2004


Update of /cvsroot/python/python/dist/src/Lib
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2754

Modified Files:
	random.py 
Log Message:
Take advantage of the math library's ldexp for assembling a float by
components without division and without roundoff error for properly
sized mantissas (i.e. on systems with 53 or more mantissa bits per
float).  Eliminates the previous implementation's rounding bias as
aptly demonstrated by Tim Peters.



Index: random.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/random.py,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -d -r1.63 -r1.64
--- random.py	30 Aug 2004 06:14:28 -0000	1.63
+++ random.py	31 Aug 2004 01:05:15 -0000	1.64
@@ -43,7 +43,7 @@
 from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethodType
 from math import log as _log, exp as _exp, pi as _pi, e as _e
 from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
-from math import floor as _floor
+from math import floor as _floor, ldexp as _ldexp
 
 __all__ = ["Random","seed","random","uniform","randint","choice","sample",
            "randrange","shuffle","normalvariate","lognormvariate",
@@ -63,13 +63,11 @@
     from binascii import hexlify as _hexlify
 except ImportError:
     _urandom = None
-else:
-    _tofloat = 2.0 ** (-7*8)    # converts 7 byte integers to floats
 
 
 # Translated by Guido van Rossum from C source provided by
 # Adrian Baddeley.  Adapted by Raymond Hettinger for use with
-# the Mersenne Twister core generator.
+# the Mersenne Twister  and os.urandom() core generators.
 
 import _random
 
@@ -761,7 +759,7 @@
         """Get the next random number in the range [0.0, 1.0)."""
         if _urandom is None:
             raise NotImplementedError('Cannot find hardware entropy source')
-        return long(_hexlify(_urandom(7)), 16) * _tofloat
+        return _ldexp(long(_hexlify(_urandom(7)), 16) >> 3, -BPF)
 
     def getrandbits(self, k):
         """getrandbits(k) -> x.  Generates a long int with k random bits."""



More information about the Python-checkins mailing list