summaryrefslogtreecommitdiffstats
path: root/Lib/random.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2004-09-05 00:00:42 (GMT)
committerRaymond Hettinger <python@rcn.com>2004-09-05 00:00:42 (GMT)
commitc1c43cad63a88eae694b174c9a0fe6242dd5972b (patch)
tree7ece3cc683d61331c761c51dcf48e775bdb4c369 /Lib/random.py
parentc4536a1deab6b14e4579e453289bd7648d144d36 (diff)
downloadcpython-c1c43cad63a88eae694b174c9a0fe6242dd5972b.zip
cpython-c1c43cad63a88eae694b174c9a0fe6242dd5972b.tar.gz
cpython-c1c43cad63a88eae694b174c9a0fe6242dd5972b.tar.bz2
Fulfill Martin's request to use try/except rather than a "look before
you leap" approach. Makes the early call to os.urandom() unnecessary.
Diffstat (limited to 'Lib/random.py')
-rw-r--r--Lib/random.py25
1 files changed, 8 insertions, 17 deletions
diff --git a/Lib/random.py b/Lib/random.py
index e6f6e4b..46a1b1f 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -44,6 +44,8 @@ from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethod
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 os import urandom as _urandom
+from binascii import hexlify as _hexlify
__all__ = ["Random","seed","random","uniform","randint","choice","sample",
"randrange","shuffle","normalvariate","lognormvariate",
@@ -59,13 +61,6 @@ SG_MAGICCONST = 1.0 + _log(4.5)
BPF = 53 # Number of bits in a float
RECIP_BPF = 2**-BPF
-try:
- from os import urandom as _urandom
- from binascii import hexlify as _hexlify
- _urandom(1) # verify that urandom is implemented
-except (ImportError, NotImplementedError):
- _urandom = None
-
# Translated by Guido van Rossum from C source provided by
# Adrian Baddeley. Adapted by Raymond Hettinger for use with
@@ -111,11 +106,11 @@ class Random(_random.Random):
"""
if a is None:
- if _urandom is None:
+ try:
+ a = long(_hexlify(_urandom(16)), 16)
+ except NotImplementedError:
import time
a = long(time.time() * 256) # use fractional seconds
- else:
- a = long(_hexlify(_urandom(16)), 16)
super(Random, self).seed(a)
self.gauss_next = None
@@ -620,11 +615,11 @@ class WichmannHill(Random):
"""
if a is None:
- if _urandom is None:
+ try:
+ a = long(_hexlify(_urandom(16)), 16)
+ except NotImplementedError:
import time
a = long(time.time() * 256) # use fractional seconds
- else:
- a = long(_hexlify(_urandom(16)), 16)
if not isinstance(a, (int, long)):
a = hash(a)
@@ -759,14 +754,10 @@ class HardwareRandom(Random):
def random(self):
"""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) >> 3) * RECIP_BPF
def getrandbits(self, k):
"""getrandbits(k) -> x. Generates a long int with k random bits."""
- if _urandom is None:
- raise NotImplementedError('Cannot find hardware entropy source')
if k <= 0:
raise ValueError('number of bits must be greater than zero')
if k != int(k):