Class DiscreteUniformSampler

java.lang.Object
org.apache.commons.rng.sampling.distribution.SamplerBase
org.apache.commons.rng.sampling.distribution.DiscreteUniformSampler
All Implemented Interfaces:
DiscreteSampler, SharedStateDiscreteSampler, SharedStateSampler<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.

Since:
1.0
See Also: