def METHOD_NAME(self, start, stop=None, step=1):
    """randrange([start,] stop[, step])
    same as choice(range(start, stop[, step])) without construction
    of a list"""
    ## this was lifted from Python2.2's random.py
    # This code is a bit messy to make it fast for the
    # common case while still doing adequate error checking
    istart = int(start)
    if istart != start:
        raise ValueError("non-integer arg 1 for randrange()")
    if stop is None:
        if istart > 0:
            return self.__rand(istart)
        raise ValueError("empty range for randrange()")
    istop = int(stop)
    if istop != stop:
        raise ValueError("non-integer stop for randrange()")
    if step == 1:
        if istart < istop:
            return istart + self.__rand(istop - istart)
        raise ValueError("empty range for randrange()")
    istep = int(step)
    if istep != step:
        raise ValueError("non-integer step for randrange()")
    if istep > 0:
        n = (istop - istart + istep - 1) / istep
    elif istep < 0:
        n = (istop - istart + istep + 1) / istep
    else:
        raise ValueError("zero step for randrange()")
    if n <= 0:
        raise ValueError("empty range for randrange()")
    return istart + istep*int(self.__rand(n))