class_docstr: Stats for Y = q * round(e^X / q) where X ~ U(low, high).
code: def __init__(self, low, high, q):
      low, high = list(map(float, (low, high)))
      elow = np.exp(low)
      ehigh = np.exp(high)
      qlow = safe_int_cast(np.round(elow / q)) * q
      qhigh = safe_int_cast(np.round(ehigh / q)) * q
  
      # -- loguniform for using the CDF
      lu = loguniform_gen(low=low, high=high)
  
      cut_low = np.exp(low)  # -- lowest possible pre-round value
      cut_high = min(
          qlow + 0.5 * q, ehigh  # -- highest value that would ...
      )  # -- round to qlow
      xs = [qlow]
      ps = [lu.cdf(cut_high)]
      ii = 0
      cdf_high = ps[0]
  
      while cut_high < (ehigh - 1e-10):
          # TODO: cut_low never used
          cut_high, cut_low = min(cut_high + q, ehigh), cut_high
          cdf_high, cdf_low = lu.cdf(cut_high), cdf_high
          ii += 1
          xs.append(qlow + ii * q)
          ps.append(cdf_high - cdf_low)
  
      ps = np.asarray(ps)
      ps /= ps.sum()
  
      self.low = low
      self.high = high
      self.q = q
      self.qlow = qlow
      self.qhigh = qhigh
      self.xs = np.asarray(xs)
      self.ps = ps
  
imports: import numpy
  import numpy.random
  import scipy.stats
  from scipy.stats import rv_continuous
  from scipy.stats._continuous_distns import lognorm_gen
label_desc: Use image node_id 1 to create a new qloguniform_gen object from inherited base classes: quniform_gen with example: obj = qloguniform_gen(low, high, q)