random unrepeated indicies

    Args:
        max_index (?):
        subset_size (None): (default = None)
        seed (None): (default = None)
        rng (RandomState):  random number generator(default = None)

    Returns:
        ?: subst

    CommandLine:
        python -m utool.util_numpy --exec-random_indexes

    Example:
        >>> # DISABLE_DOCTEST
        >>> from utool.util_numpy import *  # NOQA
        >>> max_index = 10
        >>> subset_size = None
        >>> seed = None
        >>> rng = np.random.RandomState(0)
        >>> subst = random_indexes(max_index, subset_size, seed, rng)
        >>> result = ('subst = %s' % (str(subst),))
        >>> print(result)

def random_indexes(max_index, subset_size=None, seed=None, rng=None):
    """ random unrepeated indicies

    Args:
        max_index (?):
        subset_size (None): (default = None)
        seed (None): (default = None)
        rng (RandomState):  random number generator(default = None)

    Returns:
        ?: subst

    CommandLine:
        python -m utool.util_numpy --exec-random_indexes

    Example:
        >>> # DISABLE_DOCTEST
        >>> from utool.util_numpy import *  # NOQA
        >>> max_index = 10
        >>> subset_size = None
        >>> seed = None
        >>> rng = np.random.RandomState(0)
        >>> subst = random_indexes(max_index, subset_size, seed, rng)
        >>> result = ('subst = %s' % (str(subst),))
        >>> print(result)
    """
    subst_ = np.arange(0, max_index)
    rng = ensure_rng(seed if rng is None else rng)
    rng.shuffle(subst_)
    if subset_size is None:
        subst = subst_
    else:
        subst = subst_[0:min(subset_size, max_index)]
    return subst