| #	WICHMANN-HILL RANDOM NUMBER GENERATOR | 
 | # | 
 | #	Wichmann, B. A. & Hill, I. D. (1982) | 
 | #	Algorithm AS 183:  | 
 | #	An efficient and portable pseudo-random number generator | 
 | #	Applied Statistics 31 (1982) 188-190 | 
 | # | 
 | #	see also:  | 
 | #		Correction to Algorithm AS 183 | 
 | #		Applied Statistics 33 (1984) 123   | 
 | # | 
 | #		McLeod, A. I. (1985) | 
 | #		A remark on Algorithm AS 183  | 
 | #		Applied Statistics 34 (1985),198-200 | 
 | # | 
 | # | 
 | #	USE: | 
 | #	whrandom.random()	yields double precision random numbers  | 
 | #				uniformly distributed between 0 and 1. | 
 | # | 
 | #	whrandom.seed()		must be called before whrandom.random() | 
 | #				to seed the generator | 
 |  | 
 |  | 
 | #	Translated by Guido van Rossum from C source provided by | 
 | #	Adrian Baddeley. | 
 |  | 
 |  | 
 | # The seed | 
 | # | 
 | _seed = [0, 0, 0] | 
 |  | 
 |  | 
 | # Set the seed | 
 | # | 
 | def seed(x, y, z): | 
 | 	_seed[:] = [x, y, z] | 
 |  | 
 |  | 
 | # Return the next random number in the range [0.0 .. 1.0) | 
 | # | 
 | def random(): | 
 | 	from math import floor		# floor() function | 
 | 	# | 
 | 	[x, y, z] = _seed | 
 | 	x = 171 * (x % 177) - 2 * (x/177) | 
 | 	y = 172 * (y % 176) - 35 * (y/176) | 
 | 	z = 170 * (z % 178) - 63 * (z/178) | 
 | 	# | 
 | 	if x < 0: x = x + 30269 | 
 | 	if y < 0: y = y + 30307 | 
 | 	if z < 0: z = z + 30323 | 
 | 	# | 
 | 	_seed[:] = [x, y, z] | 
 | 	# | 
 | 	term = float(x)/30269.0 + float(y)/30307.0 + float(z)/30323.0 | 
 | 	rand = term - floor(term) | 
 | 	# | 
 | 	if rand >= 1.0: rand = 0.0	# floor() inaccuracy? | 
 | 	# | 
 | 	return rand | 
 |  | 
 |  | 
 | # Initialize from the current time | 
 | # | 
 | def init(): | 
 | 	import time | 
 | 	t = time.time() | 
 | 	seed(t%256, t/256%256, t/65536%256) | 
 |  | 
 |  | 
 | # Make sure the generator is preset to a nonzero value | 
 | # | 
 | init() |