from random import getrandbits BASE = 2**32 def tick(): return getrandbits(32) def _randint(n): # generate a random number in [0; n] ndigits = 1 gen_range = BASE x = n while BASE <= x: x //= BASE ndigits += 1 gen_range *= BASE gen_range -= 1 # BASE^ndigits - 1 # Compute the "scale" with the properties: # - gen_range/scale >= user_range # - minimize (gen_range/scale - user_range) # - scale >= 1 if gen_range != n: scale = gen_range // (n + 1) else: scale = 1 while True: k = 0 for digit in xrange(ndigits): k *= BASE k += tick() k /= scale if k <= n: break return k def randint(a, b): # generate a random number in [a; b] if b < a: raise ValueError("b < a") return a + _randint(b - a)