def randint(low, high, shape=_Null, dtype=_Null, ctx=None, out=None, **kwargs):
    """Draw random samples from a discrete uniform distribution.

    Samples are uniformly distributed over the half-open interval *[low, high)*
    (includes *low*, but excludes *high*).

    Parameters
    ----------
    low : int, required
        Lower boundary of the output interval. All values generated will be
        greater than or equal to low.
    high : int, required
        Upper boundary of the output interval. All values generated will be
        less than high.
    shape : int or tuple of ints, optional
        The number of samples to draw. If shape is, e.g., `(m, n)` and `low` and
        `high` are scalars, output shape will be `(m, n)`.
    dtype : {'int32', 'int64'}, optional
        Data type of output samples. Default is 'int32'
    ctx : Context, optional
        Device context of output. Default is current context. Overridden by
        `low.context` when `low` is an NDArray.
    out : NDArray, optional
        Store output to an existing NDArray.

    Returns
    -------
    NDArray
        An NDArray of type `dtype`. If input `shape` has shape, e.g.,
        `(m, n)`, the returned NDArray will shape will be `(m, n)`. Contents
        of the returned NDArray will be samples from the interval `[low, high)`.

    Examples
    --------
    >>> mx.nd.random.randint(5, 100)
    [ 90]
    <NDArray 1 @cpu(0)
    >>> mx.nd.random.randint(-10, 2, ctx=mx.gpu(0))
    [ -8]
    <NDArray 1 @gpu(0)>
    >>> mx.nd.random.randint(-10, 10, shape=(2,))
    [ -5  4]
    <NDArray 2 @cpu(0)>
    """
    return _random_helper(_internal._random_randint, None,
                          [low, high], shape, dtype, ctx, out, kwargs)