Class MarsagliaTsangWangDiscreteSampler
java.lang.Object
org.apache.commons.rng.sampling.distribution.MarsagliaTsangWangDiscreteSampler
Sampler for a discrete distribution using an optimised look-up table.
- The method requires 30-bit integer probabilities that sum to 230 as described in George Marsaglia, Wai Wan Tsang, Jingbo Wang (2004) Fast Generation of Discrete Random Variables. Journal of Statistical Software. Vol. 11, Issue. 3, pp. 1-11.
Sampling uses 1 call to UniformRandomProvider.nextInt()
.
Memory requirements depend on the maximum number of possible sample values, n
,
and the values for the probabilities. Storage is optimised for n
. The worst case
scenario is a uniform distribution of the maximum sample size. This is capped at 0.06MB for
n <=
28, 17.0MB for n <=
216, and 4.3GB for
n <=
230. Realistic requirements will be in the kB range.
The sampler supports the following distributions:
- Enumerated distribution (probabilities must be provided for each sample)
- Poisson distribution up to
mean = 1024
- Binomial distribution up to
trials = 65535
- Since:
- 1.3
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static class
The base class for Marsaglia-Tsang-Wang samplers.static final class
Create a sampler for the Binomial distribution.static final class
Create a sampler for an enumerated distribution ofn
values each with an associated probability.private static class
An implementation for the sample algorithm based on the decomposition of the index in the range[0,2^30)
into 5 base-64 digits with 16-bit backing storage.private static class
An implementation for the sample algorithm based on the decomposition of the index in the range[0,2^30)
into 5 base-64 digits with 32-bit backing storage.private static class
An implementation for the sample algorithm based on the decomposition of the index in the range[0,2^30)
into 5 base-64 digits with 8-bit backing storage.static final class
Create a sampler for the Poisson distribution. -
Field Summary
Fields -
Constructor Summary
ConstructorsModifierConstructorDescriptionprivate
Class contains only static methods. -
Method Summary
Modifier and TypeMethodDescriptionprivate static SharedStateDiscreteSampler
createSampler
(UniformRandomProvider rng, String distributionName, int[] prob, int offset) Create a new instance for probabilitiesp(i)
where the sample valuex
isi + offset
.private static int
getBase64Digit
(int m, int k) Gets the kth base 64 digit ofm
.private static int
toUnsignedInt30
(double p) Convert the probability to an integer in the range [0,2^30].
-
Field Details
-
INT_8
private static final int INT_8The value 28 as anint
.- See Also:
-
INT_16
private static final int INT_16The value 216 as anint
.- See Also:
-
INT_30
private static final int INT_30The value 230 as anint
.- See Also:
-
DOUBLE_31
private static final double DOUBLE_31The value 231 as adouble
.- See Also:
-
-
Constructor Details
-
MarsagliaTsangWangDiscreteSampler
private MarsagliaTsangWangDiscreteSampler()Class contains only static methods.
-
-
Method Details
-
getBase64Digit
private static int getBase64Digit(int m, int k) Gets the kth base 64 digit ofm
.- Parameters:
m
- the value m.k
- the digit.- Returns:
- the base 64 digit
-
toUnsignedInt30
private static int toUnsignedInt30(double p) Convert the probability to an integer in the range [0,2^30]. This is the numerator of a fraction with assumed denominator 230.- Parameters:
p
- Probability.- Returns:
- the fraction numerator
-
createSampler
private static SharedStateDiscreteSampler createSampler(UniformRandomProvider rng, String distributionName, int[] prob, int offset) Create a new instance for probabilitiesp(i)
where the sample valuex
isi + offset
.The sum of the probabilities must be >= 230. Only the values for cumulative probability up to 230 will be sampled.
- Parameters:
rng
- Generator of uniformly distributed random numbers.distributionName
- Distribution name.prob
- The probabilities.offset
- The offset (must be positive).- Returns:
- Sampler.
-