Class MarsagliaTsangWangDiscreteSampler

java.lang.Object
org.apache.commons.rng.sampling.distribution.MarsagliaTsangWangDiscreteSampler

public final class MarsagliaTsangWangDiscreteSampler extends Object
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:
  • Field Details

  • 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 of m.
      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 probabilities p(i) where the sample value x is i + 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.