--- /dev/null
+# Copyright 2002 by Katharine Lindner. All rights reserved.
+# This code is part of the Biopython distribution and governed by its
+# license. Please see the LICENSE file that should have been included
+# as part of this package.
+
+"""handles true random numbers supplied from the the web server of fourmilab. Based on atmospheric noise. The motivation is to support biosimulations that rely on random numbers.
+"""
+
+import urllib
+
+
+def hex_convert(text):
+ import warnings
+ warnings.warn("The function Bio.HotRand.hex_convert is deprecated. Instead of Bio.HotRand.hex_convert(text), please use int(text, 16) instead", DeprecationWarning)
+ return int(text, 16)
+
+def byte_concat( text ):
+ val = 0
+ numbytes = len( text )
+ for i in range( 0, numbytes ):
+ val = val * 256
+ val = val + ord( text[ i ] )
+
+ return val
+
+class HotCache:
+
+ def __init__( self ):
+# self.url = 'http://www.fourmilab.ch/cgi-bin/uncgi/Hotbits?num=5000&min=1&max=6&col=1'
+ self.url = 'http://www.random.org/cgi-bin/randbyte?'
+ self.query = { 'nbytes' : 128, 'fmt' : 'h' }
+ self.fill_hot_cache()
+
+ def fill_hot_cache( self ):
+ url = self.url + urllib.urlencode( self.query )
+ fh = urllib.urlopen( url )
+ self.hot_cache = fh.read()
+ fh.close()
+
+ def next_num( self, num_digits = 4 ):
+ cache = self.hot_cache
+ numbytes = num_digits / 2
+ if( len( cache ) % numbytes != 0 ):
+ print 'len_cache is %d' % len( cache )
+ raise ValueError
+ if( cache == '' ):
+ self.fill_hot_cache()
+ cache = self.hot_cache
+ hexdigits = cache[ :numbytes ]
+ self.hot_cache = cache[ numbytes: ]
+ return byte_concat( hexdigits )
+
+
+
+class HotRandom:
+
+ def __init__( self ):
+ self.hot_cache = HotCache( )
+
+ def hot_rand( self, high, low = 0 ):
+ span = high - low
+ val = self.hot_cache.next_num()
+ val = ( span * val ) >> 16
+ val = val + low
+ return val
+
+
+if( __name__ == '__main__' ):
+ hot_random = HotRandom()
+ for j in range ( 0, 130 ):
+ print hot_random.hot_rand( 25 )
+ nums = [ '0000', 'abcd', '1234', '5555', '4321', 'aaaa', 'ffff' ]
+ for num in nums:
+ print hex_convert( num )
+
+
+