Class DiscreteUniformSampler

  • All Implemented Interfaces:
    DiscreteSampler, SharedStateDiscreteSampler, SharedStateSampler<SharedStateDiscreteSampler>

    public class DiscreteUniformSampler
    extends SamplerBase
    implements SharedStateDiscreteSampler
    Discrete uniform distribution sampler.

    Sampling uses UniformRandomProvider.nextInt().

    When the range is a power of two the number of calls is 1 per sample. Otherwise a rejection algorithm is used to ensure uniformity. In the worst case scenario where the range spans half the range of an int (231 + 1) the expected number of calls is 2 per sample.

    This sampler can be used as a replacement for UniformRandomProvider.nextInt() with appropriate adjustment of the upper bound to be inclusive and will outperform that method when the range is not a power of two. The advantage is gained by pre-computation of the rejection threshold.

    The sampling algorithm is described in:

    Lemire, D (2019). Fast Random Integer Generation in an Interval. ACM Transactions on Modeling and Computer Simulation 29 (1).

    The number of int values required per sample follows a geometric distribution with a probability of success p of 1 - ((2^32 % n) / 2^32). This requires on average 1/p random int values per sample.

    See Also:
    Fast Random Integer Generation in an Interval