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/08/06 10:42:26 UTC
[commons-rng] 03/07: RNG-85: Add Middle Square Weyl Sequence to
RandomSource enum.
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 <ah...@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;