This is an automated email from the ASF dual-hosted git repository. aherbert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-statistics.git
commit 563ec02e424f7d856683999b6df3096515555560 Author: Alex Herbert <[email protected]> AuthorDate: Fri Dec 24 14:29:14 2021 +0000 Sample Nakagami using a related gamma distribution --- .../statistics/distribution/NakagamiDistribution.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java index 77f9b66..3bde611 100644 --- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java +++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java @@ -20,6 +20,9 @@ import org.apache.commons.numbers.gamma.Gamma; import org.apache.commons.numbers.gamma.GammaRatio; import org.apache.commons.numbers.gamma.LogGamma; import org.apache.commons.numbers.gamma.RegularizedGamma; +import org.apache.commons.rng.UniformRandomProvider; +import org.apache.commons.rng.sampling.distribution.AhrensDieterMarsagliaTsangGammaSampler; +import org.apache.commons.rng.sampling.distribution.SharedStateContinuousSampler; /** * Implementation of the Nakagami distribution. @@ -189,4 +192,15 @@ public final class NakagamiDistribution extends AbstractContinuousDistribution { public double getSupportUpperBound() { return SUPPORT_HI; } + + @Override + public Sampler createSampler(UniformRandomProvider rng) { + // Generate using a related Gamma distribution + // See https://en.wikipedia.org/wiki/Nakagami_distribution#Generation + final double shape = mu; + final double scale = omega / mu; + final SharedStateContinuousSampler sampler = + AhrensDieterMarsagliaTsangGammaSampler.of(rng, shape, scale); + return () -> Math.sqrt(sampler.sample()); + } }
