You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2019/07/31 21:47:20 UTC

[commons-rng] 02/08: RNG-110: Make distributions samplers implement SharedStateXXXSampler.

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-rng.git

commit 4b43e805fd856296fd1de450c62a9ce8fb3be011
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Fri Jul 19 21:21:57 2019 +0100

    RNG-110: Make distributions samplers implement SharedStateXXXSampler.
    
    XXX is Discrete or Continuous.
    
    All withUniformRandomProvider implementations updated to return an
    instance of the appropriate interface.
---
 .../AhrensDieterExponentialSampler.java            |  5 ++-
 .../AhrensDieterMarsagliaTsangGammaSampler.java    | 15 ++++-----
 .../distribution/AliasMethodDiscreteSampler.java   |  9 +++--
 .../BoxMullerNormalizedGaussianSampler.java        |  5 ++-
 .../sampling/distribution/ChengBetaSampler.java    |  5 ++-
 .../distribution/ContinuousUniformSampler.java     |  3 +-
 .../distribution/DiscreteUniformSampler.java       | 15 ++++-----
 .../rng/sampling/distribution/GaussianSampler.java |  4 +--
 .../sampling/distribution/GeometricSampler.java    | 20 +++++------
 .../distribution/GuideTableDiscreteSampler.java    |  5 ++-
 .../InverseTransformContinuousSampler.java         |  5 ++-
 .../InverseTransformDiscreteSampler.java           |  5 ++-
 .../InverseTransformParetoSampler.java             |  5 ++-
 .../distribution/KempSmallMeanPoissonSampler.java  |  5 ++-
 .../distribution/LargeMeanPoissonSampler.java      | 39 +++++++++++++---------
 .../sampling/distribution/LogNormalSampler.java    |  4 +--
 .../MarsagliaNormalizedGaussianSampler.java        |  5 ++-
 .../MarsagliaTsangWangDiscreteSampler.java         | 17 +++++-----
 .../rng/sampling/distribution/PoissonSampler.java  | 18 +++-------
 .../RejectionInversionZipfSampler.java             |  5 ++-
 .../distribution/SmallMeanPoissonSampler.java      |  5 ++-
 .../ZigguratNormalizedGaussianSampler.java         |  5 ++-
 .../AhrensDieterExponentialSamplerTest.java        |  2 +-
 ...AhrensDieterMarsagliaTsangGammaSamplerTest.java |  2 +-
 .../AliasMethodDiscreteSamplerTest.java            |  2 +-
 .../BoxMullerNormalisedGaussianSamplerTest.java    |  2 +-
 .../distribution/ChengBetaSamplerTest.java         |  2 +-
 .../distribution/ContinuousUniformSamplerTest.java |  2 +-
 .../distribution/DiscreteUniformSamplerTest.java   |  2 +-
 .../sampling/distribution/GaussianSamplerTest.java |  2 +-
 .../distribution/GeometricSamplerTest.java         |  2 +-
 .../GuideTableDiscreteSamplerTest.java             |  2 +-
 .../InverseTransformContinuousSamplerTest.java     |  2 +-
 .../InverseTransformDiscreteSamplerTest.java       |  2 +-
 .../InverseTransformParetoSamplerTest.java         |  2 +-
 .../KempSmallMeanPoissonSamplerTest.java           |  2 +-
 .../distribution/LargeMeanPoissonSamplerTest.java  |  2 +-
 .../distribution/LogNormalSamplerTest.java         |  2 +-
 .../MarsagliaNormalisedGaussianSamplerTest.java    |  2 +-
 .../MarsagliaTsangWangDiscreteSamplerTest.java     |  4 +--
 .../sampling/distribution/PoissonSamplerTest.java  |  2 +-
 .../RejectionInversionZipfSamplerTest.java         |  2 +-
 .../distribution/SmallMeanPoissonSamplerTest.java  |  2 +-
 .../ZigguratNormalizedGaussianSamplerTest.java     |  2 +-
 44 files changed, 115 insertions(+), 135 deletions(-)

diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSampler.java
index 2d93c28..0340a45 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Sampling from an <a href="http://mathworld.wolfram.com/ExponentialDistribution.html">exponential distribution</a>.
@@ -28,7 +27,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class AhrensDieterExponentialSampler
     extends SamplerBase
-    implements ContinuousSampler, SharedStateSampler<AhrensDieterExponentialSampler> {
+    implements SharedStateContinuousSampler {
     /**
      * Table containing the constants
      * \( q_i = sum_{j=1}^i (\ln 2)^j / j! = \ln 2 + (\ln 2)^2 / 2 + ... + (\ln 2)^i / i! \)
@@ -139,7 +138,7 @@ public class AhrensDieterExponentialSampler
 
     /** {@inheritDoc} */
     @Override
-    public AhrensDieterExponentialSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new AhrensDieterExponentialSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSampler.java
index 08901ff..006581d 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Sampling from the <a href="http://mathworld.wolfram.com/GammaDistribution.html">Gamma distribution</a>.
@@ -53,15 +52,15 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class AhrensDieterMarsagliaTsangGammaSampler
     extends SamplerBase
-    implements ContinuousSampler, SharedStateSampler<AhrensDieterMarsagliaTsangGammaSampler> {
+    implements SharedStateContinuousSampler {
     /** The appropriate gamma sampler for the parameters. */
-    private final ContinuousSampler delegate;
+    private final SharedStateContinuousSampler delegate;
 
     /**
      * Base class for a sampler from the Gamma distribution.
      */
     private abstract static class BaseGammaSampler
-        implements ContinuousSampler, SharedStateSampler<ContinuousSampler> {
+        implements SharedStateContinuousSampler {
 
         /** Underlying source of randomness. */
         protected final UniformRandomProvider rng;
@@ -183,7 +182,7 @@ public class AhrensDieterMarsagliaTsangGammaSampler
         }
 
         @Override
-        public ContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new AhrensDieterGammaSampler(rng, this);
         }
     }
@@ -263,7 +262,7 @@ public class AhrensDieterMarsagliaTsangGammaSampler
         }
 
         @Override
-        public ContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new MarsagliaTsangGammaSampler(rng, this);
         }
     }
@@ -291,7 +290,7 @@ public class AhrensDieterMarsagliaTsangGammaSampler
     private AhrensDieterMarsagliaTsangGammaSampler(UniformRandomProvider rng,
                                                    AhrensDieterMarsagliaTsangGammaSampler source) {
         super(null);
-        delegate = ((SharedStateSampler<ContinuousSampler>)(source.delegate)).withUniformRandomProvider(rng);
+        delegate = source.delegate.withUniformRandomProvider(rng);
     }
 
     /** {@inheritDoc} */
@@ -308,7 +307,7 @@ public class AhrensDieterMarsagliaTsangGammaSampler
 
     /** {@inheritDoc} */
     @Override
-    public AhrensDieterMarsagliaTsangGammaSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new AhrensDieterMarsagliaTsangGammaSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AliasMethodDiscreteSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AliasMethodDiscreteSampler.java
index c5018e0..2ad3593 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AliasMethodDiscreteSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AliasMethodDiscreteSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 import java.util.Arrays;
 
@@ -63,15 +62,15 @@ import java.util.Arrays;
  * <p>Larger table sizes that are a power of 2 will benefit from fast algorithms for
  * {@link UniformRandomProvider#nextInt(int)} that exploit the power of 2.</p>
  *
- * @since 1.3
  * @see <a href="https://en.wikipedia.org/wiki/Alias_method">Alias Method</a>
  * @see <a href="http://www.keithschwarz.com/darts-dice-coins/">Darts, Dice, and Coins:
  * Sampling from a Discrete Distribution by Keith Schwartz</a>
  * @see <a href="https://ieeexplore.ieee.org/document/92917">Vose (1991) IEEE Transactions
  * on Software Engineering 17, 972-975.</a>
+ * @since 1.3
  */
 public class AliasMethodDiscreteSampler
-    implements DiscreteSampler, SharedStateSampler<AliasMethodDiscreteSampler> {
+    implements SharedStateDiscreteSampler {
     /**
      * The default alpha factor for zero-padding an input probability table. The default
      * value will pad the probabilities by to the next power-of-2.
@@ -213,7 +212,7 @@ public class AliasMethodDiscreteSampler
 
         /** {@inheritDoc} */
         @Override
-        public SmallTableAliasMethodDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new SmallTableAliasMethodDiscreteSampler(rng, probability, alias);
         }
     }
@@ -280,7 +279,7 @@ public class AliasMethodDiscreteSampler
 
     /** {@inheritDoc} */
     @Override
-    public AliasMethodDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new AliasMethodDiscreteSampler(rng, probability, alias);
     }
 
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalizedGaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalizedGaussianSampler.java
index 5910060..d707670 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalizedGaussianSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalizedGaussianSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * <a href="https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform">
@@ -29,7 +28,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  * @since 1.1
  */
 public class BoxMullerNormalizedGaussianSampler
-    implements NormalizedGaussianSampler, SharedStateSampler<BoxMullerNormalizedGaussianSampler> {
+    implements NormalizedGaussianSampler, SharedStateContinuousSampler {
     /** Next gaussian. */
     private double nextGaussian = Double.NaN;
     /** Underlying source of randomness. */
@@ -79,7 +78,7 @@ public class BoxMullerNormalizedGaussianSampler
 
     /** {@inheritDoc} */
     @Override
-    public BoxMullerNormalizedGaussianSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new BoxMullerNormalizedGaussianSampler(rng);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ChengBetaSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ChengBetaSampler.java
index 682ae9c..6fe83e7 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ChengBetaSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ChengBetaSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Utility class implementing Cheng's algorithms for beta distribution sampling.
@@ -36,7 +35,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class ChengBetaSampler
     extends SamplerBase
-    implements ContinuousSampler, SharedStateSampler<ChengBetaSampler> {
+    implements SharedStateContinuousSampler {
     /** 1/2. */
     private static final double ONE_HALF = 1d / 2;
     /** 1/4. */
@@ -105,7 +104,7 @@ public class ChengBetaSampler
 
     /** {@inheritDoc} */
     @Override
-    public ChengBetaSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new ChengBetaSampler(rng, this);
     }
 
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSampler.java
index 2a3a9ea..43a7ec9 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Sampling from a uniform distribution.
@@ -28,7 +27,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class ContinuousUniformSampler
     extends SamplerBase
-    implements ContinuousSampler, SharedStateSampler<ContinuousUniformSampler> {
+    implements SharedStateContinuousSampler {
     /** Lower bound. */
     private final double lo;
     /** Higher bound. */
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSampler.java
index 1809c4c..bc1830c 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSampler.java
@@ -18,7 +18,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Discrete uniform distribution sampler.
@@ -31,16 +30,16 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class DiscreteUniformSampler
     extends SamplerBase
-    implements DiscreteSampler, SharedStateSampler<DiscreteUniformSampler> {
+    implements SharedStateDiscreteSampler {
 
     /** The appropriate uniform sampler for the parameters. */
-    private final DiscreteSampler delegate;
+    private final SharedStateDiscreteSampler delegate;
 
     /**
      * Base class for a sampler from a discrete uniform distribution.
      */
     private abstract static class AbstractDiscreteUniformSampler
-        implements DiscreteSampler, SharedStateSampler<DiscreteSampler> {
+        implements SharedStateDiscreteSampler {
 
         /** Underlying source of randomness. */
         protected final UniformRandomProvider rng;
@@ -91,7 +90,7 @@ public class DiscreteUniformSampler
         }
 
         @Override
-        public DiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new SmallRangeDiscreteUniformSampler(rng, lower, range);
         }
     }
@@ -134,7 +133,7 @@ public class DiscreteUniformSampler
         }
 
         @Override
-        public DiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new LargeRangeDiscreteUniformSampler(rng, lower, upper);
         }
     }
@@ -170,7 +169,7 @@ public class DiscreteUniformSampler
     private DiscreteUniformSampler(UniformRandomProvider rng,
                                    DiscreteUniformSampler source) {
         super(null);
-        delegate = ((SharedStateSampler<DiscreteSampler>)(source.delegate)).withUniformRandomProvider(rng);
+        delegate = source.delegate.withUniformRandomProvider(rng);
     }
 
     /** {@inheritDoc} */
@@ -187,7 +186,7 @@ public class DiscreteUniformSampler
 
     /** {@inheritDoc} */
     @Override
-    public DiscreteUniformSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new DiscreteUniformSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java
index 8362387..91c29e7 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java
@@ -25,7 +25,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  *
  * @since 1.1
  */
-public class GaussianSampler implements ContinuousSampler, SharedStateSampler<GaussianSampler> {
+public class GaussianSampler implements SharedStateContinuousSampler {
     /** Mean. */
     private final double mean;
     /** standardDeviation. */
@@ -85,7 +85,7 @@ public class GaussianSampler implements ContinuousSampler, SharedStateSampler<Ga
      * sharing state.
      */
     @Override
-    public GaussianSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new GaussianSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GeometricSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GeometricSampler.java
index f1e3470..a65a46e 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GeometricSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GeometricSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Sampling from a <a href="https://en.wikipedia.org/wiki/Geometric_distribution">geometric
@@ -46,15 +45,15 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  *
  * @since 1.3
  */
-public class GeometricSampler implements DiscreteSampler, SharedStateSampler<GeometricSampler> {
+public class GeometricSampler implements SharedStateDiscreteSampler {
     /** The appropriate geometric sampler for the parameters. */
-    private final DiscreteSampler delegate;
+    private final SharedStateDiscreteSampler delegate;
 
     /**
      * Sample from the geometric distribution when the probability of success is 1.
      */
     private static class GeometricP1Sampler
-        implements DiscreteSampler, SharedStateSampler<DiscreteSampler> {
+        implements SharedStateDiscreteSampler {
         /** The single instance. */
         static final GeometricP1Sampler INSTANCE = new GeometricP1Sampler();
 
@@ -70,7 +69,7 @@ public class GeometricSampler implements DiscreteSampler, SharedStateSampler<Geo
         }
 
         @Override
-        public DiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             // No requirement for a new instance
             return this;
         }
@@ -80,11 +79,11 @@ public class GeometricSampler implements DiscreteSampler, SharedStateSampler<Geo
      * Sample from the geometric distribution by using a related exponential distribution.
      */
     private static class GeometricExponentialSampler
-        implements DiscreteSampler, SharedStateSampler<DiscreteSampler> {
+        implements SharedStateDiscreteSampler {
         /** Underlying source of randomness. Used only for the {@link #toString()} method. */
         private final UniformRandomProvider rng;
         /** The related exponential sampler for the geometric distribution. */
-        private final AhrensDieterExponentialSampler exponentialSampler;
+        private final SharedStateContinuousSampler exponentialSampler;
 
         /**
          * @param rng Generator of uniformly distributed random numbers
@@ -128,7 +127,7 @@ public class GeometricSampler implements DiscreteSampler, SharedStateSampler<Geo
         }
 
         @Override
-        public DiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new GeometricExponentialSampler(rng, this);
         }
     }
@@ -158,9 +157,8 @@ public class GeometricSampler implements DiscreteSampler, SharedStateSampler<Geo
      * @param rng Generator of uniformly distributed random numbers
      * @param source Source to copy.
      */
-    @SuppressWarnings("unchecked")
     private GeometricSampler(UniformRandomProvider rng, GeometricSampler source) {
-        delegate = ((SharedStateSampler<DiscreteSampler>)(source.delegate)).withUniformRandomProvider(rng);
+        delegate = source.delegate.withUniformRandomProvider(rng);
     }
 
     /**
@@ -182,7 +180,7 @@ public class GeometricSampler implements DiscreteSampler, SharedStateSampler<Geo
 
     /** {@inheritDoc} */
     @Override
-    public GeometricSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new GeometricSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GuideTableDiscreteSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GuideTableDiscreteSampler.java
index cb02cbb..0ca3315 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GuideTableDiscreteSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GuideTableDiscreteSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Compute a sample from a discrete probability distribution. The cumulative probability
@@ -41,7 +40,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  * @since 1.3
  */
 public class GuideTableDiscreteSampler
-    implements DiscreteSampler, SharedStateSampler<GuideTableDiscreteSampler> {
+    implements SharedStateDiscreteSampler {
     /** The default value for {@code alpha}. */
     private static final double DEFAULT_ALPHA = 1.0;
     /** Underlying source of randomness. */
@@ -213,7 +212,7 @@ public class GuideTableDiscreteSampler
 
     /** {@inheritDoc} */
     @Override
-    public GuideTableDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new GuideTableDiscreteSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSampler.java
index f60e1d0..4401d9e 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Distribution sampler that uses the
@@ -58,7 +57,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class InverseTransformContinuousSampler
     extends SamplerBase
-    implements ContinuousSampler, SharedStateSampler<InverseTransformContinuousSampler> {
+    implements SharedStateContinuousSampler {
     /** Inverse cumulative probability function. */
     private final ContinuousInverseCumulativeProbabilityFunction function;
     /** Underlying source of randomness. */
@@ -94,7 +93,7 @@ public class InverseTransformContinuousSampler
      * must be suitable for concurrent use to ensure thread safety.</p>
      */
     @Override
-    public InverseTransformContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new InverseTransformContinuousSampler(rng, function);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSampler.java
index e10e2c4..6067a8c 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Distribution sampler that uses the
@@ -58,7 +57,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class InverseTransformDiscreteSampler
     extends SamplerBase
-    implements DiscreteSampler, SharedStateSampler<InverseTransformDiscreteSampler> {
+    implements SharedStateDiscreteSampler {
     /** Inverse cumulative probability function. */
     private final DiscreteInverseCumulativeProbabilityFunction function;
     /** Underlying source of randomness. */
@@ -94,7 +93,7 @@ public class InverseTransformDiscreteSampler
      * must be suitable for concurrent use to ensure thread safety.</p>
      */
     @Override
-    public InverseTransformDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new InverseTransformDiscreteSampler(rng, function);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSampler.java
index 4068b49..a7b6d7c 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Sampling from a <a href="https://en.wikipedia.org/wiki/Pareto_distribution">Pareto distribution</a>.
@@ -28,7 +27,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class InverseTransformParetoSampler
     extends SamplerBase
-    implements ContinuousSampler, SharedStateSampler<InverseTransformParetoSampler> {
+    implements SharedStateContinuousSampler {
     /** Scale. */
     private final double scale;
     /** 1 / Shape. */
@@ -83,7 +82,7 @@ public class InverseTransformParetoSampler
 
     /** {@inheritDoc} */
     @Override
-    public InverseTransformParetoSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new InverseTransformParetoSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/KempSmallMeanPoissonSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/KempSmallMeanPoissonSampler.java
index b3203d3..7c4a09c 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/KempSmallMeanPoissonSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/KempSmallMeanPoissonSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Sampler for the <a href="http://mathworld.wolfram.com/PoissonDistribution.html">Poisson
@@ -47,7 +46,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  * 249-253</a>
  */
 public class KempSmallMeanPoissonSampler
-    implements DiscreteSampler, SharedStateSampler<KempSmallMeanPoissonSampler> {
+    implements SharedStateDiscreteSampler {
     /** Underlying source of randomness. */
     private final UniformRandomProvider rng;
     /**
@@ -129,7 +128,7 @@ public class KempSmallMeanPoissonSampler
 
     /** {@inheritDoc} */
     @Override
-    public KempSmallMeanPoissonSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new KempSmallMeanPoissonSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSampler.java
index ce8d9ae..2a68e32 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 import org.apache.commons.rng.sampling.distribution.InternalUtils.FactorialLog;
 
 /**
@@ -45,13 +44,26 @@ import org.apache.commons.rng.sampling.distribution.InternalUtils.FactorialLog;
  * @since 1.1
  */
 public class LargeMeanPoissonSampler
-    implements DiscreteSampler, SharedStateSampler<LargeMeanPoissonSampler> {
+    implements SharedStateDiscreteSampler {
     /** Upper bound to avoid truncation. */
     private static final double MAX_MEAN = 0.5 * Integer.MAX_VALUE;
     /** Class to compute {@code log(n!)}. This has no cached values. */
     private static final InternalUtils.FactorialLog NO_CACHE_FACTORIAL_LOG;
     /** Used when there is no requirement for a small mean Poisson sampler. */
-    private static final KempSmallMeanPoissonSampler NO_SMALL_MEAN_POISSON_SAMPLER = null;
+    private static final SharedStateDiscreteSampler NO_SMALL_MEAN_POISSON_SAMPLER =
+        new SharedStateDiscreteSampler() {
+            @Override
+            public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+                // No requirement for RNG
+                return this;
+            }
+
+            @Override
+            public int sample() {
+                // No Poisson sample
+                return 0;
+            }
+        };
 
     static {
         // Create without a cache.
@@ -61,9 +73,9 @@ public class LargeMeanPoissonSampler
     /** Underlying source of randomness. */
     private final UniformRandomProvider rng;
     /** Exponential. */
-    private final AhrensDieterExponentialSampler exponential;
+    private final SharedStateContinuousSampler exponential;
     /** Gaussian. */
-    private final ContinuousSampler gaussian;
+    private final SharedStateContinuousSampler gaussian;
     /** Local class to compute {@code log(n!)}. This may have cached values. */
     private final InternalUtils.FactorialLog factorialLog;
 
@@ -101,7 +113,7 @@ public class LargeMeanPoissonSampler
     private final double c1;
 
     /** The internal Poisson sampler for the lambda fraction. */
-    private final KempSmallMeanPoissonSampler smallMeanPoissonSampler;
+    private final SharedStateDiscreteSampler smallMeanPoissonSampler;
 
     /**
      * @param rng Generator of uniformly distributed random numbers.
@@ -195,8 +207,7 @@ public class LargeMeanPoissonSampler
                                     LargeMeanPoissonSampler source) {
         this.rng = rng;
 
-        // The Gaussian sampler has no shared state
-        gaussian = new ZigguratNormalizedGaussianSampler(rng);
+        gaussian = source.gaussian.withUniformRandomProvider(rng);
         exponential = source.exponential.withUniformRandomProvider(rng);
         // Reuse the cache
         factorialLog = source.factorialLog;
@@ -212,18 +223,14 @@ public class LargeMeanPoissonSampler
         c1 = source.c1;
 
         // Share the state of the small sampler
-        smallMeanPoissonSampler = source.smallMeanPoissonSampler == null ?
-            NO_SMALL_MEAN_POISSON_SAMPLER : // Not used.
-            source.smallMeanPoissonSampler.withUniformRandomProvider(rng);
+        smallMeanPoissonSampler = source.smallMeanPoissonSampler.withUniformRandomProvider(rng);
     }
 
     /** {@inheritDoc} */
     @Override
     public int sample() {
-
-        final int y2 = (smallMeanPoissonSampler == null) ?
-            0 : // No lambda fraction
-            smallMeanPoissonSampler.sample();
+        // This will never be null. It may be a no-op delegate that returns zero.
+        final int y2 = smallMeanPoissonSampler.sample();
 
         double x;
         double y;
@@ -295,7 +302,7 @@ public class LargeMeanPoissonSampler
 
     /** {@inheritDoc} */
     @Override
-    public LargeMeanPoissonSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new LargeMeanPoissonSampler(rng, this);
     }
 
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LogNormalSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LogNormalSampler.java
index 55dab9e..9bf9568 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LogNormalSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LogNormalSampler.java
@@ -24,7 +24,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  *
  * @since 1.1
  */
-public class LogNormalSampler implements ContinuousSampler, SharedStateSampler<LogNormalSampler> {
+public class LogNormalSampler implements SharedStateContinuousSampler {
     /** Scale. */
     private final double scale;
     /** Shape. */
@@ -86,7 +86,7 @@ public class LogNormalSampler implements ContinuousSampler, SharedStateSampler<L
      * sharing state.
      */
     @Override
-    public LogNormalSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new LogNormalSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalizedGaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalizedGaussianSampler.java
index 421288a..7068052 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalizedGaussianSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalizedGaussianSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * <a href="https://en.wikipedia.org/wiki/Marsaglia_polar_method">
@@ -31,7 +30,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  * @since 1.1
  */
 public class MarsagliaNormalizedGaussianSampler
-    implements NormalizedGaussianSampler, SharedStateSampler<MarsagliaNormalizedGaussianSampler> {
+    implements NormalizedGaussianSampler, SharedStateContinuousSampler {
     /** Next gaussian. */
     private double nextGaussian = Double.NaN;
     /** Underlying source of randomness. */
@@ -88,7 +87,7 @@ public class MarsagliaNormalizedGaussianSampler
 
     /** {@inheritDoc} */
     @Override
-    public MarsagliaNormalizedGaussianSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new MarsagliaNormalizedGaussianSampler(rng);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSampler.java
index c7528f4..32bc12e 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Sampler for a discrete distribution using an optimised look-up table.
@@ -51,7 +50,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  * 11, Issue 3</a>
  */
 public abstract class MarsagliaTsangWangDiscreteSampler
-    implements DiscreteSampler, SharedStateSampler<MarsagliaTsangWangDiscreteSampler> {
+    implements SharedStateDiscreteSampler {
     /** The value 2<sup>8</sup> as an {@code int}. */
     private static final int INT_8 = 1 << 8;
     /** The value 2<sup>16</sup> as an {@code int}. */
@@ -248,7 +247,7 @@ public abstract class MarsagliaTsangWangDiscreteSampler
         }
 
         @Override
-        public MarsagliaTsangWangDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new MarsagliaTsangWangBase64Int8DiscreteSampler(rng, this);
         }
     }
@@ -388,7 +387,7 @@ public abstract class MarsagliaTsangWangDiscreteSampler
         }
 
         @Override
-        public MarsagliaTsangWangDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new MarsagliaTsangWangBase64Int16DiscreteSampler(rng, this);
         }
     }
@@ -524,7 +523,7 @@ public abstract class MarsagliaTsangWangDiscreteSampler
         }
 
         @Override
-        public MarsagliaTsangWangDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new MarsagliaTsangWangBase64Int32DiscreteSampler(rng, this);
         }
     }
@@ -557,7 +556,7 @@ public abstract class MarsagliaTsangWangDiscreteSampler
         }
 
         @Override
-        public MarsagliaTsangWangDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             // No shared state
             return this;
         }
@@ -576,14 +575,14 @@ public abstract class MarsagliaTsangWangDiscreteSampler
         /** The number of trials. */
         private final int trials;
         /** The Binomial distribution sampler. */
-        private final MarsagliaTsangWangDiscreteSampler sampler;
+        private final SharedStateDiscreteSampler sampler;
 
         /**
          * @param trials Number of trials.
          * @param sampler Binomial distribution sampler.
          */
         MarsagliaTsangWangInversionBinomialSampler(int trials,
-                                                   MarsagliaTsangWangDiscreteSampler sampler) {
+                                                   SharedStateDiscreteSampler sampler) {
             super(null, BINOMIAL_NAME);
             this.trials = trials;
             this.sampler = sampler;
@@ -600,7 +599,7 @@ public abstract class MarsagliaTsangWangDiscreteSampler
         }
 
         @Override
-        public MarsagliaTsangWangDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
+        public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
             return new MarsagliaTsangWangInversionBinomialSampler(this.trials,
                 this.sampler.withUniformRandomProvider(rng));
         }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSampler.java
index 804a9e3..36cc04b 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Sampler for the <a href="http://mathworld.wolfram.com/PoissonDistribution.html">Poisson distribution</a>.
@@ -52,7 +51,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class PoissonSampler
     extends SamplerBase
-    implements DiscreteSampler, SharedStateSampler<PoissonSampler> {
+    implements SharedStateDiscreteSampler {
 
     /**
      * Value for switching sampling algorithm.
@@ -61,7 +60,7 @@ public class PoissonSampler
      */
     static final double PIVOT = 40;
     /** The internal Poisson sampler. */
-    private final DiscreteSampler poissonSamplerDelegate;
+    private final SharedStateDiscreteSampler poissonSamplerDelegate;
 
     /**
      * @param rng Generator of uniformly distributed random numbers.
@@ -85,16 +84,9 @@ public class PoissonSampler
      * @param source Source to copy.
      */
     private PoissonSampler(UniformRandomProvider rng,
-            PoissonSampler source) {
+                           PoissonSampler source) {
         super(null);
-
-        if (source.poissonSamplerDelegate instanceof SmallMeanPoissonSampler) {
-            poissonSamplerDelegate =
-                ((SmallMeanPoissonSampler)source.poissonSamplerDelegate).withUniformRandomProvider(rng);
-        } else {
-            poissonSamplerDelegate =
-                ((LargeMeanPoissonSampler)source.poissonSamplerDelegate).withUniformRandomProvider(rng);
-        }
+        poissonSamplerDelegate = source.poissonSamplerDelegate.withUniformRandomProvider(rng);
     }
 
     /** {@inheritDoc} */
@@ -111,7 +103,7 @@ public class PoissonSampler
 
     /** {@inheritDoc} */
     @Override
-    public PoissonSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new PoissonSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSampler.java
index 112f3fe..fb8cb9d 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSampler.java
@@ -18,7 +18,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Implementation of the <a href="https://en.wikipedia.org/wiki/Zipf's_law">Zipf distribution</a>.
@@ -29,7 +28,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  */
 public class RejectionInversionZipfSampler
     extends SamplerBase
-    implements DiscreteSampler, SharedStateSampler<RejectionInversionZipfSampler> {
+    implements SharedStateDiscreteSampler {
     /** Threshold below which Taylor series will be used. */
     private static final double TAYLOR_THRESHOLD = 1e-8;
     /** 1/2. */
@@ -195,7 +194,7 @@ public class RejectionInversionZipfSampler
 
     /** {@inheritDoc} */
     @Override
-    public RejectionInversionZipfSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new RejectionInversionZipfSampler(rng, this);
     }
 
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSampler.java
index e6a9722..331b6b0 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSampler.java
@@ -17,7 +17,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * Sampler for the <a href="http://mathworld.wolfram.com/PoissonDistribution.html">Poisson distribution</a>.
@@ -43,7 +42,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  * @since 1.1
  */
 public class SmallMeanPoissonSampler
-    implements DiscreteSampler, SharedStateSampler<SmallMeanPoissonSampler> {
+    implements SharedStateDiscreteSampler {
     /**
      * Pre-compute {@code Math.exp(-mean)}.
      * Note: This is the probability of the Poisson sample {@code P(n=0)}.
@@ -111,7 +110,7 @@ public class SmallMeanPoissonSampler
 
     /** {@inheritDoc} */
     @Override
-    public SmallMeanPoissonSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new SmallMeanPoissonSampler(rng, this);
     }
 }
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSampler.java
index a1ba383..6b8588a 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSampler.java
@@ -18,7 +18,6 @@
 package org.apache.commons.rng.sampling.distribution;
 
 import org.apache.commons.rng.UniformRandomProvider;
-import org.apache.commons.rng.sampling.SharedStateSampler;
 
 /**
  * <a href="https://en.wikipedia.org/wiki/Ziggurat_algorithm">
@@ -39,7 +38,7 @@ import org.apache.commons.rng.sampling.SharedStateSampler;
  * @since 1.1
  */
 public class ZigguratNormalizedGaussianSampler
-    implements NormalizedGaussianSampler, SharedStateSampler<ZigguratNormalizedGaussianSampler> {
+    implements NormalizedGaussianSampler, SharedStateContinuousSampler {
     /** Start of tail. */
     private static final double R = 3.442619855899;
     /** Inverse of R. */
@@ -164,7 +163,7 @@ public class ZigguratNormalizedGaussianSampler
 
     /** {@inheritDoc} */
     @Override
-    public ZigguratNormalizedGaussianSampler withUniformRandomProvider(UniformRandomProvider rng) {
+    public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) {
         return new ZigguratNormalizedGaussianSampler(rng);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSamplerTest.java
index 739a178..6fe5139 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSamplerTest.java
@@ -49,7 +49,7 @@ public class AhrensDieterExponentialSamplerTest {
         final double mean = 1.23;
         final AhrensDieterExponentialSampler sampler1 =
             new AhrensDieterExponentialSampler(rng1, mean);
-        final AhrensDieterExponentialSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSamplerTest.java
index 11ba878..27a4198 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSamplerTest.java
@@ -81,7 +81,7 @@ public class AhrensDieterMarsagliaTsangGammaSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final AhrensDieterMarsagliaTsangGammaSampler sampler1 =
             new AhrensDieterMarsagliaTsangGammaSampler(rng1, alpha, theta);
-        final AhrensDieterMarsagliaTsangGammaSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AliasMethodDiscreteSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AliasMethodDiscreteSamplerTest.java
index e162f19..e5f9108 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AliasMethodDiscreteSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AliasMethodDiscreteSamplerTest.java
@@ -277,7 +277,7 @@ public class AliasMethodDiscreteSamplerTest {
         // Use negative alpha to disable padding
         final AliasMethodDiscreteSampler sampler1 =
             AliasMethodDiscreteSampler.create(rng1, probabilities, -1);
-        final AliasMethodDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalisedGaussianSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalisedGaussianSamplerTest.java
index 191cbc5..6e21e62 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalisedGaussianSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalisedGaussianSamplerTest.java
@@ -34,7 +34,7 @@ public class BoxMullerNormalisedGaussianSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final BoxMullerNormalizedGaussianSampler sampler1 =
             new BoxMullerNormalizedGaussianSampler(rng1);
-        final BoxMullerNormalizedGaussianSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ChengBetaSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ChengBetaSamplerTest.java
index 24325b0..cb630aa 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ChengBetaSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ChengBetaSamplerTest.java
@@ -65,7 +65,7 @@ public class ChengBetaSamplerTest {
         final double beta = 4.56;
         final ChengBetaSampler sampler1 =
             new ChengBetaSampler(rng1, alpha, beta);
-        final ChengBetaSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java
index 06bf53f..36b9eba 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java
@@ -60,7 +60,7 @@ public class ContinuousUniformSamplerTest {
         final double high = 4.56;
         final ContinuousUniformSampler sampler1 =
             new ContinuousUniformSampler(rng1, low, high);
-        final ContinuousUniformSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSamplerTest.java
index 3a0a34c..9b76e7a 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSamplerTest.java
@@ -64,7 +64,7 @@ public class DiscreteUniformSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final DiscreteUniformSampler sampler1 =
             new DiscreteUniformSampler(rng1, lower, upper);
-        final DiscreteUniformSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GaussianSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GaussianSamplerTest.java
index f4afb63..28ca3c0 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GaussianSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GaussianSamplerTest.java
@@ -54,7 +54,7 @@ public class GaussianSamplerTest {
         final double standardDeviation = 4.56;
         final GaussianSampler sampler1 =
             new GaussianSampler(gauss, mean, standardDeviation);
-        final GaussianSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GeometricSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GeometricSamplerTest.java
index 66eaee4..f384485 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GeometricSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GeometricSamplerTest.java
@@ -140,7 +140,7 @@ public class GeometricSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final GeometricSampler sampler1 =
             new GeometricSampler(rng1, probabilityOfSuccess);
-        final GeometricSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GuideTableDiscreteSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GuideTableDiscreteSamplerTest.java
index ec89352..e38b3db 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GuideTableDiscreteSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GuideTableDiscreteSamplerTest.java
@@ -246,7 +246,7 @@ public class GuideTableDiscreteSamplerTest {
         final double[] probabilities = {0.1, 0, 0.2, 0.3, 0.1, 0.3, 0};
         final GuideTableDiscreteSampler sampler1 =
             new GuideTableDiscreteSampler(rng1, probabilities);
-        final GuideTableDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSamplerTest.java
index 6ddbb07..99938cf 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSamplerTest.java
@@ -41,7 +41,7 @@ public class InverseTransformContinuousSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final InverseTransformContinuousSampler sampler1 =
             new InverseTransformContinuousSampler(rng1, function);
-        final InverseTransformContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSamplerTest.java
index b9d3f89..778ffe5 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSamplerTest.java
@@ -41,7 +41,7 @@ public class InverseTransformDiscreteSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final InverseTransformDiscreteSampler sampler1 =
             new InverseTransformDiscreteSampler(rng1, function);
-        final InverseTransformDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSamplerTest.java
index b4314c7..3837d1d 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSamplerTest.java
@@ -65,7 +65,7 @@ public class InverseTransformParetoSamplerTest {
         final double shape = 4.56;
         final InverseTransformParetoSampler sampler1 =
             new InverseTransformParetoSampler(rng1, scale, shape);
-        final InverseTransformParetoSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/KempSmallMeanPoissonSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/KempSmallMeanPoissonSamplerTest.java
index 04b8e7e..2796ff0 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/KempSmallMeanPoissonSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/KempSmallMeanPoissonSamplerTest.java
@@ -156,7 +156,7 @@ public class KempSmallMeanPoissonSamplerTest {
         final double mean = 1.23;
         final KempSmallMeanPoissonSampler sampler1 =
             new KempSmallMeanPoissonSampler(rng1, mean);
-        final KempSmallMeanPoissonSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java
index 89022d1..9a8c674 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java
@@ -171,7 +171,7 @@ public class LargeMeanPoissonSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final LargeMeanPoissonSampler sampler1 =
             new LargeMeanPoissonSampler(rng1, mean);
-        final LargeMeanPoissonSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LogNormalSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LogNormalSamplerTest.java
index a8ec693..3da6447 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LogNormalSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LogNormalSamplerTest.java
@@ -69,7 +69,7 @@ public class LogNormalSamplerTest {
         final double shape = 4.56;
         final LogNormalSampler sampler1 =
             new LogNormalSampler(gauss, scale, shape);
-        final LogNormalSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalisedGaussianSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalisedGaussianSamplerTest.java
index 89b7339..1155ce4 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalisedGaussianSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalisedGaussianSamplerTest.java
@@ -34,7 +34,7 @@ public class MarsagliaNormalisedGaussianSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final MarsagliaNormalizedGaussianSampler sampler1 =
             new MarsagliaNormalizedGaussianSampler(rng1);
-        final MarsagliaNormalizedGaussianSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSamplerTest.java
index 37164f7..5f2dd87 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSamplerTest.java
@@ -612,7 +612,7 @@ public class MarsagliaTsangWangDiscreteSamplerTest {
         double[] probabilities = createProbabilities(offset, prob);
         final MarsagliaTsangWangDiscreteSampler sampler1 =
                 MarsagliaTsangWangDiscreteSampler.createDiscreteDistribution(rng1, probabilities);
-        final MarsagliaTsangWangDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 
@@ -645,7 +645,7 @@ public class MarsagliaTsangWangDiscreteSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final MarsagliaTsangWangDiscreteSampler sampler1 =
                 MarsagliaTsangWangDiscreteSampler.createBinomialDistribution(rng1, trials, probabilityOfSuccess);
-        final MarsagliaTsangWangDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerTest.java
index 9899b61..362397d 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerTest.java
@@ -52,7 +52,7 @@ public class PoissonSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final PoissonSampler sampler1 =
             new PoissonSampler(rng1, mean);
-        final PoissonSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSamplerTest.java
index d7e3654..15621da 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSamplerTest.java
@@ -65,7 +65,7 @@ public class RejectionInversionZipfSamplerTest {
         final double exponent = 1.23;
         final RejectionInversionZipfSampler sampler1 =
             new RejectionInversionZipfSampler(rng1, numberOfElements, exponent);
-        final RejectionInversionZipfSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSamplerTest.java
index 8d34fac..f21bf95 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSamplerTest.java
@@ -89,7 +89,7 @@ public class SmallMeanPoissonSamplerTest {
         final double mean = 1.23;
         final SmallMeanPoissonSampler sampler1 =
             new SmallMeanPoissonSampler(rng1, mean);
-        final SmallMeanPoissonSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }
diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSamplerTest.java
index d4a2e16..1772de4 100644
--- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSamplerTest.java
+++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSamplerTest.java
@@ -57,7 +57,7 @@ public class ZigguratNormalizedGaussianSamplerTest {
         final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
         final ZigguratNormalizedGaussianSampler sampler1 =
             new ZigguratNormalizedGaussianSampler(rng1);
-        final ZigguratNormalizedGaussianSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
+        final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
         RandomAssert.assertProduceSameSequence(sampler1, sampler2);
     }
 }