Class DiscreteUniformSampler
- All Implemented Interfaces:
DiscreteSampler, SharedStateDiscreteSampler, SharedStateSampler<SharedStateDiscreteSampler>
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:
-
Constructor Summary
ConstructorsConstructorDescriptionDiscreteUniformSampler(UniformRandomProvider rng, int lower, int upper) This instance delegates sampling. -
Method Summary
Modifier and TypeMethodDescriptionstatic SharedStateDiscreteSamplerof(UniformRandomProvider rng, int lower, int upper) Creates a new discrete uniform distribution sampler.intsample()Creates anintsample.toString()Create a new instance of the sampler with the same underlying state using the given uniform random provider as the source of randomness.Methods inherited from class SamplerBase
nextDouble, nextInt, nextInt, nextLongMethods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface DiscreteSampler
samples, samples
-
Constructor Details
-
DiscreteUniformSampler
This instance delegates sampling. Use the factory methodof(UniformRandomProvider, int, int)to create an optimal sampler.- Parameters:
rng- Generator of uniformly distributed random numbers.lower- Lower bound (inclusive) of the distribution.upper- Upper bound (inclusive) of the distribution.- Throws:
IllegalArgumentException- iflower > upper.
-
-
Method Details
-
sample
Creates anintsample.- Specified by:
samplein interfaceDiscreteSampler- Returns:
- a sample.
-
toString
- Overrides:
toStringin classSamplerBase
-
withUniformRandomProvider
Create a new instance of the sampler with the same underlying state using the given uniform random provider as the source of randomness.- Specified by:
withUniformRandomProviderin interfaceSharedStateSampler<SharedStateDiscreteSampler>- Parameters:
rng- Generator of uniformly distributed random numbers.- Returns:
- the sampler
- Since:
- 1.3
-
of
Creates a new discrete uniform distribution sampler.- Parameters:
rng- Generator of uniformly distributed random numbers.lower- Lower bound (inclusive) of the distribution.upper- Upper bound (inclusive) of the distribution.- Returns:
- the sampler
- Throws:
IllegalArgumentException- iflower > upper.- Since:
- 1.3
-