Returns random samples generated according to the distribution

        Mirrors basic functionality of `rvs` method for `scipy.stats`
        random variates.  Implemented by mapping uniform numbers onto the
        inverse CDF using a closest-matching grid approach.

        Parameters
        ----------
        N : int
            Number of samples to return

        minval,maxval : float, optional
            Minimum/maximum values to resample.  Should both usually just be 
            `None`, which will default to `self.minval`/`self.maxval`.

        log : bool, optional
            Whether grid should be log- or linear-spaced.

        res : int, optional
            Resolution of CDF grid used.

        Returns
        -------
        values : ndarray
            N samples.

        Raises
        ------
        ValueError
            If maxval/minval are +/- infinity, this doesn't work because of
            the grid-based approach.

def resample(self,N,minval=None,maxval=None,log=False,res=1e4):
        """Returns random samples generated according to the distribution

        Mirrors basic functionality of `rvs` method for `scipy.stats`
        random variates.  Implemented by mapping uniform numbers onto the
        inverse CDF using a closest-matching grid approach.

        Parameters
        ----------
        N : int
            Number of samples to return

        minval,maxval : float, optional
            Minimum/maximum values to resample.  Should both usually just be 
            `None`, which will default to `self.minval`/`self.maxval`.

        log : bool, optional
            Whether grid should be log- or linear-spaced.

        res : int, optional
            Resolution of CDF grid used.

        Returns
        -------
        values : ndarray
            N samples.

        Raises
        ------
        ValueError
            If maxval/minval are +/- infinity, this doesn't work because of
            the grid-based approach.

        """
        N = int(N)
        if minval is None:
            if hasattr(self,'minval_cdf'):
                minval = self.minval_cdf
            else:
                minval = self.minval
        if maxval is None:
            if hasattr(self,'maxval_cdf'):
                maxval = self.maxval_cdf
            else:
                maxval = self.maxval

        if maxval==np.inf or minval==-np.inf:
            raise ValueError('must have finite upper and lower bounds to resample. (set minval, maxval kws)')

        u = rand.random(size=N)
        if log:
            vals = np.logspace(log10(minval),log10(maxval),res)
        else:
            vals = np.linspace(minval,maxval,res)
            
        #sometimes cdf is flat.  so ys will need to be uniqued
        ys,yinds = np.unique(self.cdf(vals), return_index=True)
        vals = vals[yinds]
        

        inds = np.digitize(u,ys)
        return vals[inds]