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 3b4adc05fc42c3741b6323d96359e4420ba5bd62 Author: Alex Herbert <aherb...@apache.org> AuthorDate: Mon Aug 5 11:46:37 2019 +0100 RNG-85: Add Middle Square Weyl Sequence to RandomSource enum. The generator requires a high quality seed is generated using a custom seeding routine. --- .../commons/rng/examples/jmh/BaselineSources.java | 1 + .../commons/rng/examples/jmh/RandomSourceValues.java | 1 + .../org/apache/commons/rng/simple/RandomSource.java | 10 +++++++++- .../commons/rng/simple/internal/ProviderBuilder.java | 19 ++++++++++++++++++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/BaselineSources.java b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/BaselineSources.java index 9404e1b..b47cb31 100644 --- a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/BaselineSources.java +++ b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/BaselineSources.java @@ -92,6 +92,7 @@ public abstract class BaselineSources { "PCG_RXS_M_XS_64", "PCG_MCG_XSH_RR_32", "PCG_MCG_XSH_RS_32", + "MSWS", }) private String randomSourceName; diff --git a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/RandomSourceValues.java b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/RandomSourceValues.java index 9b0c6a1..449a4de 100644 --- a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/RandomSourceValues.java +++ b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/RandomSourceValues.java @@ -70,6 +70,7 @@ public class RandomSourceValues { "PCG_RXS_M_XS_64", "PCG_MCG_XSH_RR_32", "PCG_MCG_XSH_RS_32", + "MSWS", }) private String randomSourceName; diff --git a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/RandomSource.java b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/RandomSource.java index af160b3..06ac923 100644 --- a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/RandomSource.java +++ b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/RandomSource.java @@ -426,7 +426,15 @@ public enum RandomSource { * <li>Native seed size: 1.</li> * </ul> */ - PCG_MCG_XSH_RS_32(ProviderBuilder.RandomSourceInternal.PCG_MCG_XSH_RS_32); + PCG_MCG_XSH_RS_32(ProviderBuilder.RandomSourceInternal.PCG_MCG_XSH_RS_32), + /** + * Source of randomness is {@link org.apache.commons.rng.core.source32.MiddleSquareWeylSequence}. + * <ul> + * <li>Native seed type: {@code Long}.</li> + * <li>Native seed size: 3.</li> + * </ul> + */ + MSWS(ProviderBuilder.RandomSourceInternal.MSWS); /** Internal identifier. */ private final ProviderBuilder.RandomSourceInternal internalIdentifier; diff --git a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/ProviderBuilder.java b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/ProviderBuilder.java index d0746d8..0487b82 100644 --- a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/ProviderBuilder.java +++ b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/ProviderBuilder.java @@ -31,6 +31,7 @@ import org.apache.commons.rng.core.source32.Well44497a; import org.apache.commons.rng.core.source32.Well44497b; import org.apache.commons.rng.core.source32.ISAACRandom; import org.apache.commons.rng.core.source32.MersenneTwister; +import org.apache.commons.rng.core.source32.MiddleSquareWeylSequence; import org.apache.commons.rng.core.source32.MultiplyWithCarry256; import org.apache.commons.rng.core.source32.KISSRandom; import org.apache.commons.rng.core.source32.XoRoShiRo64Star; @@ -245,7 +246,23 @@ public final class ProviderBuilder { /** Source of randomness is {@link PcgMcgXshRs32}. */ PCG_MCG_XSH_RS_32(PcgMcgXshRs32.class, 1, - NativeSeedType.LONG); + NativeSeedType.LONG), + /** Source of randomness is {@link MiddleSquareWeylSequence}. */ + MSWS(MiddleSquareWeylSequence.class, + 3, + NativeSeedType.LONG_ARRAY) { + @Override + Object createSeed() { + // This generator requires a high quality Weyl increment. + final long seed = SeedFactory.createLong(); + final long increment = SeedUtils.createLongHexPermutation(new SplitMix64(seed)); + // The initial state should not be low complexity but the Weyl + // state can be any number. + final long state = increment; + final long weylState = seed; + return new long[] {state, weylState, increment}; + } + }; /** Source type. */ private final Class<? extends UniformRandomProvider> rng;