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 167d502abfc6196fe2891e2f3912dcc73809ab4a
Author: aherbert <aherb...@apache.org>
AuthorDate: Fri Sep 27 11:51:01 2019 +0100

    RNG-118: XoRoShiRo PlusPlus generators.
    
    XoShiRo128PlusPlus
    XoRoShiRo128PlusPlus
    XoShiRo256PlusPlus
    XoShiRo512PlusPlus
    XoRoShiRo1024PlusPlus
    XoRoShiRo1024Star
    XoRoShiRo1024StarStar
---
 .../XoShiRo128PlusPlus.java}                       |  57 +++---
 .../rng/core/source64/AbstractXoRoShiRo1024.java   | 200 +++++++++++++++++++++
 .../rng/core/source64/AbstractXoRoShiRo128.java    |   2 +-
 ...128StarStar.java => XoRoShiRo1024PlusPlus.java} |  48 ++---
 ...hiRo128StarStar.java => XoRoShiRo1024Star.java} |  47 ++---
 ...128StarStar.java => XoRoShiRo1024StarStar.java} |  48 ++---
 ...o128StarStar.java => XoRoShiRo128PlusPlus.java} |  50 ++++--
 .../rng/core/source64/XoRoShiRo128StarStar.java    |   2 +-
 ...iRo128StarStar.java => XoShiRo256PlusPlus.java} |  44 +++--
 ...iRo128StarStar.java => XoShiRo512PlusPlus.java} |  54 ++++--
 .../org/apache/commons/rng/core/ProvidersList.java |  14 ++
 .../rng/core/source32/XoShiRo128PlusPlusTest.java  | 112 ++++++++++++
 .../core/source64/XoRoShiRo1024PlusPlusTest.java   | 108 +++++++++++
 .../core/source64/XoRoShiRo1024StarStarTest.java   | 108 +++++++++++
 .../rng/core/source64/XoRoShiRo1024StarTest.java   | 108 +++++++++++
 .../core/source64/XoRoShiRo128PlusPlusTest.java    | 112 ++++++++++++
 .../rng/core/source64/XoShiRo256PlusPlusTest.java  | 112 ++++++++++++
 .../rng/core/source64/XoShiRo512PlusPlusTest.java  | 114 ++++++++++++
 .../rng/core/source64/XoShiRo512StarStarTest.java  |   1 -
 19 files changed, 1168 insertions(+), 173 deletions(-)

diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java
similarity index 58%
copy from 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
copy to 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java
index b273279..80cfd1e 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlus.java
@@ -15,42 +15,44 @@
  * limitations under the License.
  */
 
-package org.apache.commons.rng.core.source64;
+package org.apache.commons.rng.core.source32;
 
 /**
- * A fast all-purpose 64-bit generator.
+ * A fast all-purpose 32-bit generator. For faster generation of {@code float} 
values try the
+ * {@link XoShiRo128Plus} generator.
  *
- * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 128 bits
- * and the period is 2<sup>128</sup>-1. Speed is expected to be similar to
- * {@link XoShiRo256StarStar}.</p>
+ * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 128
+ * bits.</p>
  *
- * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128statstar.c";>Original 
source code</a>
+ * @see <a href="http://xoshiro.di.unimi.it/xoshiro128plusplus.c";>Original 
source code</a>
  * @see <a href="http://xoshiro.di.unimi.it/";>xorshiro / xoroshiro 
generators</a>
  *
  * @since 1.3
  */
-public class XoRoShiRo128StarStar extends AbstractXoRoShiRo128 {
+public class XoShiRo128PlusPlus extends AbstractXoShiRo128 {
     /**
      * Creates a new instance.
      *
      * @param seed Initial seed.
-     * If the length is larger than 2, only the first 2 elements will
+     * If the length is larger than 4, only the first 4 elements will
      * be used; if smaller, the remaining elements will be automatically
      * set. A seed containing all zeros will create a non-functional generator.
      */
-    public XoRoShiRo128StarStar(long[] seed) {
+    public XoShiRo128PlusPlus(int[] seed) {
         super(seed);
     }
 
     /**
-     * Creates a new instance using a 2 element seed.
+     * Creates a new instance using a 4 element seed.
      * A seed containing all zeros will create a non-functional generator.
      *
      * @param seed0 Initial seed element 0.
      * @param seed1 Initial seed element 1.
+     * @param seed2 Initial seed element 2.
+     * @param seed3 Initial seed element 3.
      */
-    public XoRoShiRo128StarStar(long seed0, long seed1) {
-        super(seed0, seed1);
+    public XoShiRo128PlusPlus(int seed0, int seed1, int seed2, int seed3) {
+        super(seed0, seed1, seed2, seed3);
     }
 
     /**
@@ -58,29 +60,38 @@ public class XoRoShiRo128StarStar extends 
AbstractXoRoShiRo128 {
      *
      * @param source Source to copy.
      */
-    protected XoRoShiRo128StarStar(XoRoShiRo128StarStar source) {
+    protected XoShiRo128PlusPlus(XoShiRo128PlusPlus source) {
         super(source);
     }
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long s0 = state0;
-        long s1 = state1;
-        final long result = Long.rotateLeft(s0 * 5, 7) * 9;
+    public int next() {
+        final int result = Integer.rotateLeft(state0 + state3, 7) + state0;
 
-        s1 ^= s0;
-        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
-        state1 = Long.rotateLeft(s1, 37); // c
+        final int t = state1 << 9;
+
+        state2 ^= state0;
+        state3 ^= state1;
+        state1 ^= state2;
+        state0 ^= state3;
+
+        state2 ^= t;
+
+        state3 = Integer.rotateLeft(state3, 11);
 
         return result;
     }
 
-    /** {@inheritDoc} */
+    /**
+     * Create a copy.
+     *
+     * @return the copy
+     */
     @Override
-    protected XoRoShiRo128StarStar copy() {
+    protected XoShiRo128PlusPlus copy() {
         // This exists to ensure the jump function performed in the super 
class returns
         // the correct class type. It should not be public.
-        return new XoRoShiRo128StarStar(this);
+        return new XoShiRo128PlusPlus(this);
     }
 }
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo1024.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo1024.java
new file mode 100644
index 0000000..1a49973
--- /dev/null
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo1024.java
@@ -0,0 +1,200 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.rng.core.source64;
+
+import java.util.Arrays;
+
+import org.apache.commons.rng.JumpableUniformRandomProvider;
+import org.apache.commons.rng.LongJumpableUniformRandomProvider;
+import org.apache.commons.rng.UniformRandomProvider;
+import org.apache.commons.rng.core.util.NumberFactory;
+
+/**
+ * This abstract class is a base for algorithms from the Xor-Shift-Rotate 
family of 64-bit
+ * generators with 1024-bits of state.
+ *
+ * @see <a href="http://xoshiro.di.unimi.it/";>xorshiro / xoroshiro 
generators</a>
+ *
+ * @since 1.3
+ */
+abstract class AbstractXoRoShiRo1024 extends LongProvider implements 
LongJumpableUniformRandomProvider {
+    /** Size of the state vector. */
+    private static final int SEED_SIZE = 16;
+    /** The coefficients for the jump function. */
+    private static final long[] JUMP_COEFFICIENTS = {
+        0x931197d8e3177f17L, 0xb59422e0b9138c5fL, 0xf06a6afb49d668bbL, 
0xacb8a6412c8a1401L,
+        0x12304ec85f0b3468L, 0xb7dfe7079209891eL, 0x405b7eec77d9eb14L, 
0x34ead68280c44e4aL,
+        0xe0e4ba3e0ac9e366L, 0x8f46eda8348905b7L, 0x328bf4dbad90d6ffL, 
0xc8fd6fb31c9effc3L,
+        0xe899d452d4b67652L, 0x45f387286ade3205L, 0x03864f454a8920bdL, 
0xa68fa28725b1b384L,
+    };
+    /** The coefficients for the long jump function. */
+    private static final long[] LONG_JUMP_COEFFICIENTS = {
+        0x7374156360bbf00fL, 0x4630c2efa3b3c1f6L, 0x6654183a892786b1L, 
0x94f7bfcbfb0f1661L,
+        0x27d8243d3d13eb2dL, 0x9701730f3dfb300fL, 0x2f293baae6f604adL, 
0xa661831cb60cd8b6L,
+        0x68280c77d9fe008cL, 0x50554160f5ba9459L, 0x2fc20b17ec7b2a9aL, 
0x49189bbdc8ec9f8fL,
+        0x92a65bca41852cc1L, 0xf46820dd0509c12aL, 0x52b00c35fbf92185L, 
0x1e5b3b7f589e03c1L,
+    };
+    /** State. */
+    private final long[] state = new long[SEED_SIZE];
+    /** Index in "state" array. */
+    private int index;
+
+    /**
+     * Creates a new instance.
+     *
+     * @param seed Initial seed.
+     * If the length is larger than 16, only the first 16 elements will
+     * be used; if smaller, the remaining elements will be automatically
+     * set. A seed containing all zeros will create a non-functional generator.
+     */
+    AbstractXoRoShiRo1024(long[] seed) {
+        setSeedInternal(seed);
+    }
+
+    /**
+     * Creates a copy instance.
+     *
+     * @param source Source to copy.
+     */
+    protected AbstractXoRoShiRo1024(AbstractXoRoShiRo1024 source) {
+        super(source);
+        System.arraycopy(source.state, 0, state, 0, SEED_SIZE);
+        index = source.index;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected byte[] getStateInternal() {
+        final long[] s = Arrays.copyOf(state, SEED_SIZE + 1);
+        s[SEED_SIZE] = index;
+
+        return composeStateInternal(NumberFactory.makeByteArray(s),
+                                    super.getStateInternal());
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void setStateInternal(byte[] s) {
+        final byte[][] c = splitStateInternal(s, (SEED_SIZE + 1) * 8);
+
+        final long[] tmp = NumberFactory.makeLongArray(c[0]);
+        System.arraycopy(tmp, 0, state, 0, SEED_SIZE);
+        index = (int) tmp[SEED_SIZE];
+
+        super.setStateInternal(c[1]);
+    }
+
+    /**
+     * Seeds the RNG.
+     *
+     * @param seed Seed.
+     */
+    private void setSeedInternal(long[] seed) {
+        // Reset the whole state of this RNG (i.e. "state" and "index").
+        // Filling procedure is not part of the reference code.
+        fillState(state, seed);
+        index = 0;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public long next() {
+        final int q = index;
+        index = (index + 1) & 15;
+        final long s0 = state[index];
+        long s15 = state[q];
+        final long result = transform(s0, s15);
+
+        s15 ^= s0;
+        state[q] = Long.rotateLeft(s0, 25) ^ s15 ^ (s15 << 27);
+        state[index] = Long.rotateLeft(s15, 36);
+
+        return result;
+    }
+
+    /**
+     * Transform the two consecutive 64-bit states of the generator to a 
64-bit output.
+     * The transformation function shall vary with respect to different 
generators.
+     *
+     * @param s0 The current state.
+     * @param s15 The previous state.
+     * @return the output
+     */
+    protected abstract long transform(long s0, long s15);
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>The jump size is the equivalent of 2<sup>512</sup>
+     * calls to {@link UniformRandomProvider#nextLong() nextLong()}. It can 
provide
+     * up to 2<sup>512</sup> non-overlapping subsequences.</p>
+     */
+    @Override
+    public UniformRandomProvider jump() {
+        final UniformRandomProvider copy = copy();
+        performJump(JUMP_COEFFICIENTS);
+        return copy;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     *
+     * <p>The jump size is the equivalent of 2<sup>768</sup> calls to
+     * {@link UniformRandomProvider#nextLong() nextLong()}. It can provide up 
to
+     * 2<sup>256</sup> non-overlapping subsequences of length 2<sup>768</sup>; 
each
+     * subsequence can provide up to 2<sup>256</sup> non-overlapping 
subsequences of
+     * length 2<sup>512</sup>using the {@link #jump()} method.</p>
+     */
+    @Override
+    public JumpableUniformRandomProvider longJump() {
+        final JumpableUniformRandomProvider copy = copy();
+        performJump(LONG_JUMP_COEFFICIENTS);
+        return copy;
+    }
+
+    /**
+     * Create a copy.
+     *
+     * @return the copy
+     */
+    protected abstract AbstractXoRoShiRo1024 copy();
+
+    /**
+     * Perform the jump to advance the generator state. Resets the cached 
state of the generator.
+     *
+     * @param jumpCoefficients the jump coefficients
+     */
+    private void performJump(long[] jumpCoefficients) {
+        final long[] newState = new long[SEED_SIZE];
+        for (final long jc : jumpCoefficients) {
+            for (int b = 0; b < 64; b++) {
+                if ((jc & (1L << b)) != 0) {
+                    for (int i = 0; i < SEED_SIZE; i++) {
+                        newState[i] ^= state[(i + index) & 15];
+                    }
+                }
+                next();
+            }
+        }
+        for (int j = 0; j < 16; j++) {
+            state[(j + index) & 15] = newState[j];
+        }
+        resetCachedState();
+    }
+}
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
index c3e64f7..6530aeb 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoRoShiRo128.java
@@ -159,7 +159,7 @@ abstract class AbstractXoRoShiRo128 extends LongProvider 
implements LongJumpable
      *
      * @param jumpCoefficients Jump coefficients.
      */
-    private void performJump(long[] jumpCoefficients) {
+    final void performJump(long[] jumpCoefficients) {
         long s0 = 0;
         long s1 = 0;
         for (final long jc : jumpCoefficients) {
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo1024PlusPlus.java
similarity index 53%
copy from 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
copy to 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo1024PlusPlus.java
index b273279..4802bd9 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo1024PlusPlus.java
@@ -18,69 +18,51 @@
 package org.apache.commons.rng.core.source64;
 
 /**
- * A fast all-purpose 64-bit generator.
+ * A large-state all-purpose 64-bit generator.
  *
- * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 128 bits
- * and the period is 2<sup>128</sup>-1. Speed is expected to be similar to
- * {@link XoShiRo256StarStar}.</p>
+ * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 1024 bits
+ * and the period is 2<sup>1024</sup>-1.</p>
  *
- * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128statstar.c";>Original 
source code</a>
+ * <p>Note: This can be used as a replacement for {@link XorShift1024Star}.</p>
+ *
+ * @see <a href="http://xorshift.di.unimi.it/xoroshiro1024plusplus.c";>Original 
source code</a>
  * @see <a href="http://xoshiro.di.unimi.it/";>xorshiro / xoroshiro 
generators</a>
  *
  * @since 1.3
  */
-public class XoRoShiRo128StarStar extends AbstractXoRoShiRo128 {
+public class XoRoShiRo1024PlusPlus extends AbstractXoRoShiRo1024 {
     /**
      * Creates a new instance.
      *
      * @param seed Initial seed.
-     * If the length is larger than 2, only the first 2 elements will
+     * If the length is larger than 16, only the first 16 elements will
      * be used; if smaller, the remaining elements will be automatically
      * set. A seed containing all zeros will create a non-functional generator.
      */
-    public XoRoShiRo128StarStar(long[] seed) {
+    public XoRoShiRo1024PlusPlus(long[] seed) {
         super(seed);
     }
 
     /**
-     * Creates a new instance using a 2 element seed.
-     * A seed containing all zeros will create a non-functional generator.
-     *
-     * @param seed0 Initial seed element 0.
-     * @param seed1 Initial seed element 1.
-     */
-    public XoRoShiRo128StarStar(long seed0, long seed1) {
-        super(seed0, seed1);
-    }
-
-    /**
      * Creates a copy instance.
      *
      * @param source Source to copy.
      */
-    protected XoRoShiRo128StarStar(XoRoShiRo128StarStar source) {
+    protected XoRoShiRo1024PlusPlus(XoRoShiRo1024PlusPlus source) {
         super(source);
     }
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long s0 = state0;
-        long s1 = state1;
-        final long result = Long.rotateLeft(s0 * 5, 7) * 9;
-
-        s1 ^= s0;
-        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
-        state1 = Long.rotateLeft(s1, 37); // c
-
-        return result;
+    protected long transform(long s0, long s15) {
+        return Long.rotateLeft(s0 + s15, 23) + s15;
     }
 
     /** {@inheritDoc} */
     @Override
-    protected XoRoShiRo128StarStar copy() {
-        // This exists to ensure the jump function performed in the super 
class returns
+    protected XoRoShiRo1024PlusPlus copy() {
+        // This exists to ensure the jump function returns
         // the correct class type. It should not be public.
-        return new XoRoShiRo128StarStar(this);
+        return new XoRoShiRo1024PlusPlus(this);
     }
 }
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo1024Star.java
similarity index 54%
copy from 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
copy to 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo1024Star.java
index b273279..7d85015 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo1024Star.java
@@ -18,69 +18,50 @@
 package org.apache.commons.rng.core.source64;
 
 /**
- * A fast all-purpose 64-bit generator.
+ * A large-state 64-bit generator suitable for {@code double} generation. This 
is slightly faster
+ * than the all-purpose generator {@link XoRoShiRo1024PlusPlus}.
  *
- * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 128 bits
- * and the period is 2<sup>128</sup>-1. Speed is expected to be similar to
- * {@link XoShiRo256StarStar}.</p>
+ * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 1024 bits
+ * and the period is 2<sup>1024</sup>-1.</p>
  *
- * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128statstar.c";>Original 
source code</a>
+ * @see <a href="http://xorshift.di.unimi.it/xoroshiro1024star.c";>Original 
source code</a>
  * @see <a href="http://xoshiro.di.unimi.it/";>xorshiro / xoroshiro 
generators</a>
  *
  * @since 1.3
  */
-public class XoRoShiRo128StarStar extends AbstractXoRoShiRo128 {
+public class XoRoShiRo1024Star extends AbstractXoRoShiRo1024 {
     /**
      * Creates a new instance.
      *
      * @param seed Initial seed.
-     * If the length is larger than 2, only the first 2 elements will
+     * If the length is larger than 16, only the first 16 elements will
      * be used; if smaller, the remaining elements will be automatically
      * set. A seed containing all zeros will create a non-functional generator.
      */
-    public XoRoShiRo128StarStar(long[] seed) {
+    public XoRoShiRo1024Star(long[] seed) {
         super(seed);
     }
 
     /**
-     * Creates a new instance using a 2 element seed.
-     * A seed containing all zeros will create a non-functional generator.
-     *
-     * @param seed0 Initial seed element 0.
-     * @param seed1 Initial seed element 1.
-     */
-    public XoRoShiRo128StarStar(long seed0, long seed1) {
-        super(seed0, seed1);
-    }
-
-    /**
      * Creates a copy instance.
      *
      * @param source Source to copy.
      */
-    protected XoRoShiRo128StarStar(XoRoShiRo128StarStar source) {
+    protected XoRoShiRo1024Star(XoRoShiRo1024Star source) {
         super(source);
     }
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long s0 = state0;
-        long s1 = state1;
-        final long result = Long.rotateLeft(s0 * 5, 7) * 9;
-
-        s1 ^= s0;
-        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
-        state1 = Long.rotateLeft(s1, 37); // c
-
-        return result;
+    protected long transform(long s0, long s15) {
+        return s0 * 0x9e3779b97f4a7c13L;
     }
 
     /** {@inheritDoc} */
     @Override
-    protected XoRoShiRo128StarStar copy() {
-        // This exists to ensure the jump function performed in the super 
class returns
+    protected XoRoShiRo1024Star copy() {
+        // This exists to ensure the jump function returns
         // the correct class type. It should not be public.
-        return new XoRoShiRo128StarStar(this);
+        return new XoRoShiRo1024Star(this);
     }
 }
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo1024StarStar.java
similarity index 53%
copy from 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
copy to 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo1024StarStar.java
index b273279..9a39e12 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo1024StarStar.java
@@ -18,69 +18,51 @@
 package org.apache.commons.rng.core.source64;
 
 /**
- * A fast all-purpose 64-bit generator.
+ * A large-state all-purpose 64-bit generator.
  *
- * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 128 bits
- * and the period is 2<sup>128</sup>-1. Speed is expected to be similar to
- * {@link XoShiRo256StarStar}.</p>
+ * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 1024 bits
+ * and the period is 2<sup>1024</sup>-1.</p>
  *
- * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128statstar.c";>Original 
source code</a>
+ * <p>Note: This can be used as a replacement for {@link XorShift1024Star}.</p>
+ *
+ * @see <a href="http://xorshift.di.unimi.it/xoroshiro1024starstar.c";>Original 
source code</a>
  * @see <a href="http://xoshiro.di.unimi.it/";>xorshiro / xoroshiro 
generators</a>
  *
  * @since 1.3
  */
-public class XoRoShiRo128StarStar extends AbstractXoRoShiRo128 {
+public class XoRoShiRo1024StarStar extends AbstractXoRoShiRo1024 {
     /**
      * Creates a new instance.
      *
      * @param seed Initial seed.
-     * If the length is larger than 2, only the first 2 elements will
+     * If the length is larger than 16, only the first 16 elements will
      * be used; if smaller, the remaining elements will be automatically
      * set. A seed containing all zeros will create a non-functional generator.
      */
-    public XoRoShiRo128StarStar(long[] seed) {
+    public XoRoShiRo1024StarStar(long[] seed) {
         super(seed);
     }
 
     /**
-     * Creates a new instance using a 2 element seed.
-     * A seed containing all zeros will create a non-functional generator.
-     *
-     * @param seed0 Initial seed element 0.
-     * @param seed1 Initial seed element 1.
-     */
-    public XoRoShiRo128StarStar(long seed0, long seed1) {
-        super(seed0, seed1);
-    }
-
-    /**
      * Creates a copy instance.
      *
      * @param source Source to copy.
      */
-    protected XoRoShiRo128StarStar(XoRoShiRo128StarStar source) {
+    protected XoRoShiRo1024StarStar(XoRoShiRo1024StarStar source) {
         super(source);
     }
 
     /** {@inheritDoc} */
     @Override
-    public long next() {
-        final long s0 = state0;
-        long s1 = state1;
-        final long result = Long.rotateLeft(s0 * 5, 7) * 9;
-
-        s1 ^= s0;
-        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
-        state1 = Long.rotateLeft(s1, 37); // c
-
-        return result;
+    protected long transform(long s0, long s15) {
+        return Long.rotateLeft(s0 * 5, 7) * 9;
     }
 
     /** {@inheritDoc} */
     @Override
-    protected XoRoShiRo128StarStar copy() {
-        // This exists to ensure the jump function performed in the super 
class returns
+    protected XoRoShiRo1024StarStar copy() {
+        // This exists to ensure the jump function returns
         // the correct class type. It should not be public.
-        return new XoRoShiRo128StarStar(this);
+        return new XoRoShiRo1024StarStar(this);
     }
 }
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java
similarity index 59%
copy from 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
copy to 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java
index b273279..d753745 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlus.java
@@ -17,6 +17,9 @@
 
 package org.apache.commons.rng.core.source64;
 
+import org.apache.commons.rng.JumpableUniformRandomProvider;
+import org.apache.commons.rng.UniformRandomProvider;
+
 /**
  * A fast all-purpose 64-bit generator.
  *
@@ -24,12 +27,21 @@ package org.apache.commons.rng.core.source64;
  * and the period is 2<sup>128</sup>-1. Speed is expected to be similar to
  * {@link XoShiRo256StarStar}.</p>
  *
- * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128statstar.c";>Original 
source code</a>
+ * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128plusplus.c";>Original 
source code</a>
  * @see <a href="http://xoshiro.di.unimi.it/";>xorshiro / xoroshiro 
generators</a>
  *
  * @since 1.3
  */
-public class XoRoShiRo128StarStar extends AbstractXoRoShiRo128 {
+public class XoRoShiRo128PlusPlus extends AbstractXoRoShiRo128 {
+    /** The coefficients for the jump function. */
+    private static final long[] JUMP_COEFFICIENTS = {
+        0x2bd7a6a6e99c2ddcL, 0x0992ccaf6a6fca05L
+    };
+    /** The coefficients for the long jump function. */
+    private static final long[] LONG_JUMP_COEFFICIENTS = {
+        0x360fd5f2cf8d5d99L, 0x9c6e6877736c46e3L
+    };
+
     /**
      * Creates a new instance.
      *
@@ -38,7 +50,7 @@ public class XoRoShiRo128StarStar extends 
AbstractXoRoShiRo128 {
      * be used; if smaller, the remaining elements will be automatically
      * set. A seed containing all zeros will create a non-functional generator.
      */
-    public XoRoShiRo128StarStar(long[] seed) {
+    public XoRoShiRo128PlusPlus(long[] seed) {
         super(seed);
     }
 
@@ -49,7 +61,7 @@ public class XoRoShiRo128StarStar extends 
AbstractXoRoShiRo128 {
      * @param seed0 Initial seed element 0.
      * @param seed1 Initial seed element 1.
      */
-    public XoRoShiRo128StarStar(long seed0, long seed1) {
+    public XoRoShiRo128PlusPlus(long seed0, long seed1) {
         super(seed0, seed1);
     }
 
@@ -58,7 +70,7 @@ public class XoRoShiRo128StarStar extends 
AbstractXoRoShiRo128 {
      *
      * @param source Source to copy.
      */
-    protected XoRoShiRo128StarStar(XoRoShiRo128StarStar source) {
+    protected XoRoShiRo128PlusPlus(XoRoShiRo128PlusPlus source) {
         super(source);
     }
 
@@ -67,20 +79,38 @@ public class XoRoShiRo128StarStar extends 
AbstractXoRoShiRo128 {
     public long next() {
         final long s0 = state0;
         long s1 = state1;
-        final long result = Long.rotateLeft(s0 * 5, 7) * 9;
+        final long result = Long.rotateLeft(s0 + s1, 17) + s0;
 
         s1 ^= s0;
-        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
-        state1 = Long.rotateLeft(s1, 37); // c
+        state0 = Long.rotateLeft(s0, 49) ^ s1 ^ (s1 << 21); // a, b
+        state1 = Long.rotateLeft(s1, 28); // c
 
         return result;
     }
 
     /** {@inheritDoc} */
     @Override
-    protected XoRoShiRo128StarStar copy() {
+    public UniformRandomProvider jump() {
+        // Duplicated from the abstract class to change the jump coefficients
+        final UniformRandomProvider copy = copy();
+        performJump(JUMP_COEFFICIENTS);
+        return copy;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public JumpableUniformRandomProvider longJump() {
+        // Duplicated from the abstract class to change the jump coefficients
+        final JumpableUniformRandomProvider copy = copy();
+        performJump(LONG_JUMP_COEFFICIENTS);
+        return copy;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected XoRoShiRo128PlusPlus copy() {
         // This exists to ensure the jump function performed in the super 
class returns
         // the correct class type. It should not be public.
-        return new XoRoShiRo128StarStar(this);
+        return new XoRoShiRo128PlusPlus(this);
     }
 }
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
index b273279..c926d17 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
@@ -24,7 +24,7 @@ package org.apache.commons.rng.core.source64;
  * and the period is 2<sup>128</sup>-1. Speed is expected to be similar to
  * {@link XoShiRo256StarStar}.</p>
  *
- * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128statstar.c";>Original 
source code</a>
+ * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128starstar.c";>Original 
source code</a>
  * @see <a href="http://xoshiro.di.unimi.it/";>xorshiro / xoroshiro 
generators</a>
  *
  * @since 1.3
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java
similarity index 65%
copy from 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
copy to 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java
index b273279..4d43e23 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlus.java
@@ -20,37 +20,38 @@ package org.apache.commons.rng.core.source64;
 /**
  * A fast all-purpose 64-bit generator.
  *
- * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 128 bits
- * and the period is 2<sup>128</sup>-1. Speed is expected to be similar to
- * {@link XoShiRo256StarStar}.</p>
+ * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 256 bits
+ * and the period is 2<sup>256</sup>-1.</p>
  *
- * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128statstar.c";>Original 
source code</a>
+ * @see <a href="http://xoshiro.di.unimi.it/xoshiro256starstar.c";>Original 
source code</a>
  * @see <a href="http://xoshiro.di.unimi.it/";>xorshiro / xoroshiro 
generators</a>
  *
  * @since 1.3
  */
-public class XoRoShiRo128StarStar extends AbstractXoRoShiRo128 {
+public class XoShiRo256PlusPlus extends AbstractXoShiRo256 {
     /**
      * Creates a new instance.
      *
      * @param seed Initial seed.
-     * If the length is larger than 2, only the first 2 elements will
+     * If the length is larger than 4, only the first 4 elements will
      * be used; if smaller, the remaining elements will be automatically
      * set. A seed containing all zeros will create a non-functional generator.
      */
-    public XoRoShiRo128StarStar(long[] seed) {
+    public XoShiRo256PlusPlus(long[] seed) {
         super(seed);
     }
 
     /**
-     * Creates a new instance using a 2 element seed.
+     * Creates a new instance using a 4 element seed.
      * A seed containing all zeros will create a non-functional generator.
      *
      * @param seed0 Initial seed element 0.
      * @param seed1 Initial seed element 1.
+     * @param seed2 Initial seed element 2.
+     * @param seed3 Initial seed element 3.
      */
-    public XoRoShiRo128StarStar(long seed0, long seed1) {
-        super(seed0, seed1);
+    public XoShiRo256PlusPlus(long seed0, long seed1, long seed2, long seed3) {
+        super(seed0, seed1, seed2, seed3);
     }
 
     /**
@@ -58,29 +59,34 @@ public class XoRoShiRo128StarStar extends 
AbstractXoRoShiRo128 {
      *
      * @param source Source to copy.
      */
-    protected XoRoShiRo128StarStar(XoRoShiRo128StarStar source) {
+    protected XoShiRo256PlusPlus(XoShiRo256PlusPlus source) {
         super(source);
     }
 
     /** {@inheritDoc} */
     @Override
     public long next() {
-        final long s0 = state0;
-        long s1 = state1;
-        final long result = Long.rotateLeft(s0 * 5, 7) * 9;
+        final long result = Long.rotateLeft(state0 + state3, 23) + state0;
 
-        s1 ^= s0;
-        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
-        state1 = Long.rotateLeft(s1, 37); // c
+        final long t = state1 << 17;
+
+        state2 ^= state0;
+        state3 ^= state1;
+        state1 ^= state2;
+        state0 ^= state3;
+
+        state2 ^= t;
+
+        state3 = Long.rotateLeft(state3, 45);
 
         return result;
     }
 
     /** {@inheritDoc} */
     @Override
-    protected XoRoShiRo128StarStar copy() {
+    protected XoShiRo256PlusPlus copy() {
         // This exists to ensure the jump function performed in the super 
class returns
         // the correct class type. It should not be public.
-        return new XoRoShiRo128StarStar(this);
+        return new XoShiRo256PlusPlus(this);
     }
 }
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java
similarity index 56%
copy from 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
copy to 
commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java
index b273279..0223944 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoRoShiRo128StarStar.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlus.java
@@ -18,39 +18,46 @@
 package org.apache.commons.rng.core.source64;
 
 /**
- * A fast all-purpose 64-bit generator.
+ * A fast all-purpose generator.
  *
- * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 128 bits
- * and the period is 2<sup>128</sup>-1. Speed is expected to be similar to
+ * <p>This is a member of the Xor-Shift-Rotate family of generators. Memory 
footprint is 512 bits
+ * and the period is 2<sup>512</sup>-1. Speed is expected to be slower than
  * {@link XoShiRo256StarStar}.</p>
  *
- * @see <a href="http://xoshiro.di.unimi.it/xoroshiro128statstar.c";>Original 
source code</a>
+ * @see <a href="http://xoshiro.di.unimi.it/xoshiro512plusplus.c";>Original 
source code</a>
  * @see <a href="http://xoshiro.di.unimi.it/";>xorshiro / xoroshiro 
generators</a>
  *
  * @since 1.3
  */
-public class XoRoShiRo128StarStar extends AbstractXoRoShiRo128 {
+public class XoShiRo512PlusPlus extends AbstractXoShiRo512 {
     /**
      * Creates a new instance.
      *
      * @param seed Initial seed.
-     * If the length is larger than 2, only the first 2 elements will
+     * If the length is larger than 8, only the first 8 elements will
      * be used; if smaller, the remaining elements will be automatically
      * set. A seed containing all zeros will create a non-functional generator.
      */
-    public XoRoShiRo128StarStar(long[] seed) {
+    public XoShiRo512PlusPlus(long[] seed) {
         super(seed);
     }
 
     /**
-     * Creates a new instance using a 2 element seed.
+     * Creates a new instance using an 8 element seed.
      * A seed containing all zeros will create a non-functional generator.
      *
      * @param seed0 Initial seed element 0.
      * @param seed1 Initial seed element 1.
+     * @param seed2 Initial seed element 2.
+     * @param seed3 Initial seed element 3.
+     * @param seed4 Initial seed element 4.
+     * @param seed5 Initial seed element 5.
+     * @param seed6 Initial seed element 6.
+     * @param seed7 Initial seed element 7.
      */
-    public XoRoShiRo128StarStar(long seed0, long seed1) {
-        super(seed0, seed1);
+    public XoShiRo512PlusPlus(long seed0, long seed1, long seed2, long seed3,
+                              long seed4, long seed5, long seed6, long seed7) {
+        super(seed0, seed1, seed2, seed3, seed4, seed5, seed6, seed7);
     }
 
     /**
@@ -58,29 +65,38 @@ public class XoRoShiRo128StarStar extends 
AbstractXoRoShiRo128 {
      *
      * @param source Source to copy.
      */
-    protected XoRoShiRo128StarStar(XoRoShiRo128StarStar source) {
+    protected XoShiRo512PlusPlus(XoShiRo512PlusPlus source) {
         super(source);
     }
 
     /** {@inheritDoc} */
     @Override
     public long next() {
-        final long s0 = state0;
-        long s1 = state1;
-        final long result = Long.rotateLeft(s0 * 5, 7) * 9;
+        final long result = Long.rotateLeft(state0 + state2, 17) + state2;
 
-        s1 ^= s0;
-        state0 = Long.rotateLeft(s0, 24) ^ s1 ^ (s1 << 16); // a, b
-        state1 = Long.rotateLeft(s1, 37); // c
+        final long t = state1 << 11;
+
+        state2 ^= state0;
+        state5 ^= state1;
+        state1 ^= state2;
+        state7 ^= state3;
+        state3 ^= state4;
+        state4 ^= state5;
+        state0 ^= state6;
+        state6 ^= state7;
+
+        state6 ^= t;
+
+        state7 = Long.rotateLeft(state7, 21);
 
         return result;
     }
 
     /** {@inheritDoc} */
     @Override
-    protected XoRoShiRo128StarStar copy() {
+    protected XoShiRo512PlusPlus copy() {
         // This exists to ensure the jump function performed in the super 
class returns
         // the correct class type. It should not be public.
-        return new XoRoShiRo128StarStar(this);
+        return new XoShiRo512PlusPlus(this);
     }
 }
diff --git 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/ProvidersList.java 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/ProvidersList.java
index 9995df2..6a0282b 100644
--- 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/ProvidersList.java
+++ 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/ProvidersList.java
@@ -27,6 +27,7 @@ import org.apache.commons.rng.core.source32.Well512a;
 import org.apache.commons.rng.core.source32.XoRoShiRo64Star;
 import org.apache.commons.rng.core.source32.XoRoShiRo64StarStar;
 import org.apache.commons.rng.core.source32.XoShiRo128Plus;
+import org.apache.commons.rng.core.source32.XoShiRo128PlusPlus;
 import org.apache.commons.rng.core.source32.XoShiRo128StarStar;
 import org.apache.commons.rng.core.source32.Well1024a;
 import org.apache.commons.rng.core.source32.Well19937a;
@@ -47,11 +48,17 @@ import org.apache.commons.rng.core.source64.SplitMix64;
 import org.apache.commons.rng.core.source64.XorShift1024Star;
 import org.apache.commons.rng.core.source64.XorShift1024StarPhi;
 import org.apache.commons.rng.core.source64.TwoCmres;
+import org.apache.commons.rng.core.source64.XoRoShiRo1024PlusPlus;
+import org.apache.commons.rng.core.source64.XoRoShiRo1024Star;
+import org.apache.commons.rng.core.source64.XoRoShiRo1024StarStar;
 import org.apache.commons.rng.core.source64.XoRoShiRo128Plus;
+import org.apache.commons.rng.core.source64.XoRoShiRo128PlusPlus;
 import org.apache.commons.rng.core.source64.XoRoShiRo128StarStar;
 import org.apache.commons.rng.core.source64.XoShiRo256Plus;
+import org.apache.commons.rng.core.source64.XoShiRo256PlusPlus;
 import org.apache.commons.rng.core.source64.XoShiRo256StarStar;
 import org.apache.commons.rng.core.source64.XoShiRo512Plus;
+import org.apache.commons.rng.core.source64.XoShiRo512PlusPlus;
 import org.apache.commons.rng.core.source64.XoShiRo512StarStar;
 import org.apache.commons.rng.core.source64.JenkinsSmallFast64;
 import org.apache.commons.rng.core.source64.MersenneTwister64;
@@ -112,6 +119,7 @@ public final class ProvidersList {
             add(LIST32, new MiddleSquareWeylSequence(new long[] {g.nextLong(), 
g.nextLong(), 0xb5ad4eceda1ce2a9L}));
             add(LIST32, new DotyHumphreySmallFastCounting32(new int[] 
{g.nextInt(), g.nextInt()}));
             add(LIST32, new JenkinsSmallFast32(g.nextInt()));
+            add(LIST32, new XoShiRo128PlusPlus(new int[] {g.nextInt(), 
g.nextInt(), g.nextInt()}));
             // ... add more here.
 
             // "long"-based RNGs.
@@ -130,6 +138,12 @@ public final class ProvidersList {
             add(LIST64, new PcgRxsMXs64(new long[] {g.nextLong()}));
             add(LIST64, new DotyHumphreySmallFastCounting64(new long[] 
{g.nextLong(), g.nextLong()}));
             add(LIST64, new JenkinsSmallFast64(g.nextLong()));
+            add(LIST64, new XoRoShiRo128PlusPlus(new long[] {g.nextLong(), 
g.nextLong()}));
+            add(LIST64, new XoShiRo256PlusPlus(new long[] {g.nextLong(), 
g.nextLong(), g.nextLong(), g.nextLong()}));
+            add(LIST64, new XoShiRo512PlusPlus(new long[] {g.nextLong(), 
g.nextLong(), g.nextLong(), g.nextLong()}));
+            add(LIST64, new XoRoShiRo1024PlusPlus(new long[] {g.nextLong(), 
g.nextLong(), g.nextLong(), g.nextLong()}));
+            add(LIST64, new XoRoShiRo1024Star(new long[] {g.nextLong(), 
g.nextLong(), g.nextLong(), g.nextLong()}));
+            add(LIST64, new XoRoShiRo1024StarStar(new long[] {g.nextLong(), 
g.nextLong(), g.nextLong(), g.nextLong()}));
             // ... add more here.
 
             // Do not modify the remaining statements.
diff --git 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlusTest.java
 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlusTest.java
new file mode 100644
index 0000000..bd21c62
--- /dev/null
+++ 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source32/XoShiRo128PlusPlusTest.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.rng.core.source32;
+
+import org.apache.commons.rng.core.RandomAssert;
+import org.junit.Test;
+
+public class XoShiRo128PlusPlusTest {
+    /** The size of the array seed. */
+    private static final int SEED_SIZE = 4;
+
+    /*
+     * Data from running the executable compiled from the author's C code:
+     *   http://xoshiro.di.unimi.it/xoshiro128plusplus.c
+     */
+
+    private static final int[] SEED = {
+        0x012de1ba, 0xa5a818b8, 0xb124ea2b, 0x18e03749,
+    };
+
+    private static final int[] EXPECTED_SEQUENCE = {
+        0x083a6347, 0xaf13e949, 0xc170e7f6, 0x1fff4fb2,
+        0x683f45ee, 0x0447edcf, 0x42e85ced, 0xaf636b74,
+        0xb0087a5e, 0x75bf2669, 0xd1bce8bd, 0x421fc05e,
+        0x1c6c405f, 0x14ddbffd, 0xaeacb705, 0x977ae584,
+        0x2ac01aac, 0xc474ec71, 0xe0888022, 0xf94bc227,
+        0x32775b57, 0x44142b05, 0x525f6d9b, 0xa2721e61,
+        0x1bfe5c72, 0x17be23c2, 0x3231cc54, 0x8776866e,
+        0x9ede2587, 0x0f7f144e, 0xb6f2ff9d, 0x1556365b,
+        0x9e68aef3, 0x254010c3, 0x0b885bdd, 0x7c3f26bb,
+        0xc8266de6, 0xcd2e6587, 0x0cbec249, 0xa69b37ba,
+    };
+
+    private static final int[] EXPECTED_SEQUENCE_AFTER_JUMP  = {
+        0x4485d85f, 0x43f4d8a7, 0xe21ea064, 0x3eddd57d,
+        0x44f6149a, 0xde7e1c16, 0xa7410410, 0x6360a4a9,
+        0x34dab153, 0xfdf089b0, 0xa9b78551, 0xa2136cee,
+        0x0ad2126f, 0x67a62b78, 0xa3e8c1fa, 0x19eed39b,
+        0x83357624, 0xde015e70, 0xdc670b3b, 0x833dc245,
+        0x4d644c84, 0x30e7ea9f, 0x9dd22362, 0x70978ced,
+        0xf3d07dbb, 0xfdad08e5, 0x9118ebe0, 0x5dc55edf,
+        0xcf9abe08, 0x7a822c3b, 0xa1115ecf, 0x9f8cc327,
+        0x452c8954, 0xf920ef83, 0xcff75ece, 0x9622a70d,
+        0x6202e501, 0x10ae0703, 0x8b7ee1be, 0xc72c1cf6,
+    };
+
+    private static final int[] EXPECTED_SEQUENCE_AFTER_LONG_JUMP  = {
+        0x27906b5a, 0xe2ce9fb2, 0xd97f8c4f, 0x7609af7d,
+        0x5b91ddd8, 0x4134b769, 0x47f505f2, 0xacc18832,
+        0xeea7faf6, 0x50178ca9, 0xc15f4b36, 0xcbd206e6,
+        0x4f2273cb, 0xebaabeef, 0x51e6d76f, 0xaf1fdde8,
+        0x3cb5ced1, 0x04b42264, 0x2396256f, 0x9c0618ff,
+        0x95ecbb0c, 0xc88c952c, 0x820664ab, 0x5d2e6153,
+        0xb2003213, 0x71531ff6, 0x99d4bd53, 0xbd15fcc1,
+        0x90ad002b, 0x3d37b45d, 0x500b49db, 0x6f81b35f,
+        0x533f3bab, 0xe22a25fe, 0x114ca833, 0x4ab45586,
+        0x077ca93d, 0xd5cf0025, 0xbe019f55, 0x8ecbe4a8,
+    };
+
+    @Test
+    public void testReferenceCode() {
+        RandomAssert.assertEquals(EXPECTED_SEQUENCE, new 
XoShiRo128PlusPlus(SEED));
+    }
+
+    @Test
+    public void testConstructorWithZeroSeedIsNonFunctional() {
+        RandomAssert.assertNextIntZeroOutput(new XoShiRo128PlusPlus(new 
int[SEED_SIZE]), 2 * SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithSingleBitSeedIsFunctional() {
+        
RandomAssert.assertIntArrayConstructorWithSingleBitSeedIsFunctional(XoShiRo128PlusPlus.class,
 SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithoutFullLengthSeed() {
+        // Hit the case when the input seed is self-seeded when not full length
+        RandomAssert.assertNextLongNonZeroOutput(new XoShiRo128PlusPlus(new 
int[] {SEED[0]}),
+                SEED_SIZE, SEED_SIZE);
+    }
+
+    @Test
+    public void testElementConstructor() {
+        final XoShiRo128PlusPlus rng1 = new XoShiRo128PlusPlus(SEED);
+        final XoShiRo128PlusPlus rng2 = new XoShiRo128PlusPlus(SEED[0], 
SEED[1], SEED[2], SEED[3]);
+        RandomAssert.assertNextIntEquals(SEED.length * 2, rng1, rng2);
+    }
+
+    @Test
+    public void testJump() {
+        RandomAssert.assertJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_JUMP, new XoShiRo128PlusPlus(SEED));
+    }
+
+    @Test
+    public void testLongJump() {
+        RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoShiRo128PlusPlus(SEED));
+    }
+}
diff --git 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo1024PlusPlusTest.java
 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo1024PlusPlusTest.java
new file mode 100644
index 0000000..0816400
--- /dev/null
+++ 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo1024PlusPlusTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.rng.core.source64;
+
+import org.apache.commons.rng.core.RandomAssert;
+import org.junit.Test;
+
+public class XoRoShiRo1024PlusPlusTest {
+    /** The size of the array SEED. */
+    private static final int SEED_SIZE = 16;
+
+    /*
+     * Data from running the executable compiled from the author's C code:
+     *   http://xoshiro.di.unimi.it/xoroshiro1024plusplus.c
+     */
+
+    private static final long[] SEED = {
+        0x012de1babb3c4104L, 0xa5a818b8fc5aa503L, 0xb124ea2b701f4993L, 
0x18e0374933d8c782L,
+        0x2af8df668d68ad55L, 0x76e56f59daa06243L, 0xf58c016f0f01e30fL, 
0x8eeafa41683dbbf4L,
+        0x7bf121347c06677fL, 0x4fd0c88d25db5ccbL, 0x99af3be9ebe0a272L, 
0x94f2b33b74d0bdcbL,
+        0x24b5d9d7a00a3140L, 0x79d983d781a34a3cL, 0x582e4a84d595f5ecL, 
0x7316fe8b0f606d20L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE = {
+        0x3b09ad2dbf0fac01L, 0xc94a7fe723f359b9L, 0xe6e1dd32bf791bfcL, 
0xb7544ad223abd2d8L,
+        0xf30327faf9c86e1bL, 0xe6e5f8e0c3ee32eeL, 0xd0517ea6f0a6dff8L, 
0xe7ab840562f624f9L,
+        0x46974064298e33c5L, 0xb1c7d3a0a763d025L, 0x516b8571e4870ed4L, 
0xc6fb23b5d1e49b84L,
+        0x09aa6d82bcab4254L, 0x23719002bbe8f966L, 0x0d67afdb43a5dca4L, 
0x297327cb4057c221L,
+        0x4b2af2a3dba0da80L, 0x9eda3fa5e098414aL, 0x6806ec1363b1e1b9L, 
0x6efe75a6813c59c6L,
+        0x335baf867960e5fbL, 0x9f4415ecc8830b7aL, 0xe1c6456883daafbdL, 
0x50d175bab6ac665cL,
+        0x8122d5175b11d1f5L, 0xb3671ac101492a4bL, 0x658bac8aa044c300L, 
0xa652105130589a28L,
+        0xf49f0307772db260L, 0x9d18a1bd5200fcbcL, 0x9cd41d5db25d6593L, 
0xe34ecdb564717debL,
+        0x8affe46f54d83679L, 0x67639a77a4199b87L, 0xa0d788390eaa4b68L, 
0x67f84eff59949883L,
+        0xc374a0949d9e7c44L, 0xdb3251d6eb8cfc68L, 0x130ac6799fd3b059L, 
0x72258b39becdf313L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_JUMP = {
+        0x12907f578f2a163cL, 0xc5034828888b0a7dL, 0xb2cc81c062eb12c9L, 
0x7cb14f46bc6c47b1L,
+        0x5f5641c733b6b7c9L, 0x36eed13f65e22019L, 0xa6e9a258ec194d05L, 
0xf5a6cf90bfed11f1L,
+        0xe37a7b9b9e8b429eL, 0xa30129f12e7ca354L, 0x6c38ec46d7707a41L, 
0xfd8e399d18e8fccaL,
+        0xf93f723ea2ba8b80L, 0xef4b6593ecb01139L, 0x774015239c7fd6adL, 
0xc868b4129532870aL,
+        0x7a77dc9ea4cebdddL, 0x217dd8bd12b281e1L, 0x18dbc96aa091bf40L, 
0xfbb8397be69034d7L,
+        0xfb686ead6dcadfd7L, 0x25a17990b448429dL, 0x7476a4cef88b1766L, 
0xd6b4eccc2b574014L,
+        0x89bc48ea54f24968L, 0x9a779e116dd3ac15L, 0xa10f0df74bd66f83L, 
0xfbadde536a6ed6b6L,
+        0xa9b98fcc285f5920L, 0x07d8a0b3fb1c89baL, 0x413de5a03081fac0L, 
0xfa12ec0e83efcdc9L,
+        0x84280bbe5242a8c2L, 0xae6da4ff89c29e50L, 0xe611cd4047f50f31L, 
0x972cdee05fc6c463L,
+        0x69679b42d792ec82L, 0xfb610ac33ca4efd3L, 0xcb78db0ccb62e334L, 
0xd7e1ca3dc8db39c4L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_LONG_JUMP = {
+        0x9144383654573d60L, 0x6223e80cec1a7284L, 0xc24ec8b470b103e8L, 
0xeeae61f7a3220c62L,
+        0xafebedd0e1fa737eL, 0x860201c60edbaf3eL, 0x4b0579f618188e95L, 
0x767032c20a4553b5L,
+        0xcf6ac990528dd14fL, 0x047eed71a8bfdd05L, 0xbc3afb7e47c198ccL, 
0x10ee99db24684f0bL,
+        0xe28af1c36d0b80c7L, 0xa648390a61f79e01L, 0x19ed67bc53b7604aL, 
0x22454886633affaeL,
+        0x925cc38296b612f5L, 0x7490feb237c248bcL, 0xea57d10bd26d79adL, 
0x31b5fb910df0d3c6L,
+        0x49ce7616a038a946L, 0x75bff93a6c5a2bc3L, 0xaf75a56b81a4d784L, 
0x41b4b1aa4e59172aL,
+        0xb4ec816fd4484d88L, 0xa8ba3b236a03520aL, 0x88f8c9f2776e8182L, 
0x8b4096cdb6668ff8L,
+        0xaf90a119ab52bab5L, 0x516ebfdce73f105cL, 0x7f04868cc1c439a3L, 
0x8cd3eae52205020fL,
+        0x505a05e2eaf6af10L, 0x9f16121875db8153L, 0x92032da26a981a00L, 
0x1486140057b674b1L,
+        0x335ac573af5d92a3L, 0x72a601de5a4547f9L, 0xb3e8d3309e3f1327L, 
0x21a6aae8ec8b1966L,
+    };
+
+    @Test
+    public void testReferenceCode() {
+        RandomAssert.assertEquals(EXPECTED_SEQUENCE, new 
XoRoShiRo1024PlusPlus(SEED));
+    }
+
+    @Test
+    public void testConstructorWithZeroSeedIsNonFunctional() {
+        RandomAssert.assertNextIntZeroOutput(new XoRoShiRo1024PlusPlus(new 
long[SEED_SIZE]), 2 * SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithSingleBitSeedIsFunctional() {
+        
RandomAssert.assertLongArrayConstructorWithSingleBitSeedIsFunctional(XoRoShiRo1024PlusPlus.class,
 SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithoutFullLengthSeed() {
+        // Hit the case when the input seed is self-seeded when not full length
+        RandomAssert.assertNextLongNonZeroOutput(new XoRoShiRo1024PlusPlus(new 
long[] {SEED[0]}),
+                SEED_SIZE, SEED_SIZE);
+    }
+
+    @Test
+    public void testJump() {
+        RandomAssert.assertJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_JUMP, new XoRoShiRo1024PlusPlus(SEED));
+    }
+
+    @Test
+    public void testLongJump() {
+        RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoRoShiRo1024PlusPlus(SEED));
+    }
+}
diff --git 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo1024StarStarTest.java
 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo1024StarStarTest.java
new file mode 100644
index 0000000..de35a76
--- /dev/null
+++ 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo1024StarStarTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.rng.core.source64;
+
+import org.apache.commons.rng.core.RandomAssert;
+import org.junit.Test;
+
+public class XoRoShiRo1024StarStarTest {
+    /** The size of the array SEED. */
+    private static final int SEED_SIZE = 16;
+
+    /*
+     * Data from running the executable compiled from the author's C code:
+     *   http://xoshiro.di.unimi.it/xoroshiro1024starstar.c
+     */
+
+    private static final long[] SEED = {
+        0x012de1babb3c4104L, 0xa5a818b8fc5aa503L, 0xb124ea2b701f4993L, 
0x18e0374933d8c782L,
+        0x2af8df668d68ad55L, 0x76e56f59daa06243L, 0xf58c016f0f01e30fL, 
0x8eeafa41683dbbf4L,
+        0x7bf121347c06677fL, 0x4fd0c88d25db5ccbL, 0x99af3be9ebe0a272L, 
0x94f2b33b74d0bdcbL,
+        0x24b5d9d7a00a3140L, 0x79d983d781a34a3cL, 0x582e4a84d595f5ecL, 
0x7316fe8b0f606d20L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE = {
+        0x462c422df780c48eL, 0xbe94d15abff76d8aL, 0xb4dbef0e8d88ef2eL, 
0xdfa2836db33bfc43L,
+        0x2a4965b718a2e4f1L, 0xce2042d1aa74d50dL, 0xa6febfa96d04f58dL, 
0xb16b1ce69018ab5dL,
+        0xd9a067d3c7a7d9ffL, 0xe6c40f3b3e470500L, 0x54c0b9c458ae5b94L, 
0xfba57390e5542333L,
+        0x9e1670e4da0647b0L, 0x118cacc5ae1d413cL, 0x855f38d9f9975117L, 
0xb1d8ae900456c302L,
+        0x30d6603089b0b5a5L, 0x9b0a5cdd71d36a73L, 0x22598c5adb8a49e3L, 
0xbe240590cf3abae3L,
+        0x9c474364766386e4L, 0x675f099732c21ff2L, 0x432308deff79f4ccL, 
0x18106f6cbcbb93d5L,
+        0x5f87dd27193d4bf5L, 0xd540713e20f70062L, 0xa8e03c5477d99848L, 
0xc01f257b1ad88046L,
+        0x67522ec1327b3994L, 0x4c05d92051d406faL, 0xa03daf3fcd37a5ccL, 
0x821445c6408c9722L,
+        0xf7bbbffc2db460bdL, 0x5b42694c4af4d5caL, 0x408899b212aec78eL, 
0x8cf109d6952df65eL,
+        0xb7e8d62389e997cdL, 0xf4d82497338d8c89L, 0x7f53cea4f43609b9L, 
0xa0ecb8e0fa98f352L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_JUMP = {
+        0x5b636f163fc729e7L, 0x707beb36c524d1bdL, 0xa04aa6338804faa5L, 
0xa05a8b17c27aadbaL,
+        0xaa753a7fb6657575L, 0xe22cf9d201f9ee0cL, 0x922b4f8e56fae8bdL, 
0xb460d44f4dac553aL,
+        0x6b6a2771b70f8dc9L, 0x9ba789987085a9eeL, 0x5d3a89d1d38e935eL, 
0x4d8cf26eba3ceb11L,
+        0x17773c0482382356L, 0x7348d4e4e6ff6ea7L, 0x21f79b80d74d2e00L, 
0xea221a71545c67b9L,
+        0x49aeedb5ca88a5e0L, 0xdf91aaef5bca531bL, 0x91ad24c1bc05880aL, 
0x1b4c2a769c2a0602L,
+        0xfb45e555e943d087L, 0x2fa45261b0447ae8L, 0xc7df5ba87f846bebL, 
0x0ee7351cbc43681eL,
+        0x475aefe9ee1743ceL, 0x277a4780d6ac2a37L, 0xbc88b9e78bad80beL, 
0x3cc1034ce7df5ca4L,
+        0x1f10fcc26ef5376aL, 0x09b9a2233e5bc52fL, 0xe074e46d4d117fecL, 
0x5303bc71643cb162L,
+        0xbd148f7c799e6bb3L, 0xb562ea36a5c9ad62L, 0xbb0ed30e291a901fL, 
0x0be93a50e3ad0c4aL,
+        0x08a3a364587f88a9L, 0xc799a663b02566efL, 0x69d258c77cf97b43L, 
0x8e14b0ffaf0f6bb2L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_LONG_JUMP = {
+        0x29d4cc1fe4502216L, 0x81fe29054d484511L, 0xcf4e2f1f65dc852aL, 
0x05993959c8d9d985L,
+        0xb57512c9299013c2L, 0xd2b8a57fc03dd67aL, 0x76ab1e45f4b8ff83L, 
0xd276813593cac49bL,
+        0xc2f796572548f66fL, 0x7bad52ec5018d885L, 0x7d679c0324cdb96cL, 
0xae500f725e175105L,
+        0x869fde40ae42de70L, 0x2b8d995a2dfbac20L, 0x32391cf98dcc6fe7L, 
0xd5ef6a4b2900cbb5L,
+        0x0f6dc088c163aba4L, 0x5f072870f2394255L, 0x0915668ce75ca5bfL, 
0xee97505819af2f8aL,
+        0x0e0aaeb44813209bL, 0x1aa3e857d2a250f2L, 0x8fc5f60afad20c9eL, 
0x3be2b0549452d2e8L,
+        0x7ec70fe0db81c3a3L, 0x97941a6b3d611110L, 0x0ad410b1b1a0a1edL, 
0x24574ac5004bd459L,
+        0x46cd9e7cb86a283dL, 0xae3164713f141638L, 0x36a3e58636929c8dL, 
0x5db41ba175a678a2L,
+        0x54052dfa35a50c8aL, 0xf24bd17fad5e7174L, 0xc5c51f1cbc2f8a21L, 
0x34b1ca5c1769f076L,
+        0xbb5924f5674d6712L, 0x9309c6aa3701f4c8L, 0x1885c9eedd107655L, 
0x55f4a50aeda95998L,
+    };
+
+    @Test
+    public void testReferenceCode() {
+        RandomAssert.assertEquals(EXPECTED_SEQUENCE, new 
XoRoShiRo1024StarStar(SEED));
+    }
+
+    @Test
+    public void testConstructorWithZeroSeedIsNonFunctional() {
+        RandomAssert.assertNextIntZeroOutput(new XoRoShiRo1024StarStar(new 
long[SEED_SIZE]), 2 * SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithSingleBitSeedIsFunctional() {
+        
RandomAssert.assertLongArrayConstructorWithSingleBitSeedIsFunctional(XoRoShiRo1024StarStar.class,
 SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithoutFullLengthSeed() {
+        // Hit the case when the input seed is self-seeded when not full length
+        RandomAssert.assertNextLongNonZeroOutput(new XoRoShiRo1024StarStar(new 
long[] {SEED[0]}),
+                SEED_SIZE, SEED_SIZE);
+    }
+
+    @Test
+    public void testJump() {
+        RandomAssert.assertJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_JUMP, new XoRoShiRo1024StarStar(SEED));
+    }
+
+    @Test
+    public void testLongJump() {
+        RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoRoShiRo1024StarStar(SEED));
+    }
+}
diff --git 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo1024StarTest.java
 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo1024StarTest.java
new file mode 100644
index 0000000..add5b74
--- /dev/null
+++ 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo1024StarTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.rng.core.source64;
+
+import org.apache.commons.rng.core.RandomAssert;
+import org.junit.Test;
+
+public class XoRoShiRo1024StarTest {
+    /** The size of the array SEED. */
+    private static final int SEED_SIZE = 16;
+
+    /*
+     * Data from running the executable compiled from the author's C code:
+     *   http://xoshiro.di.unimi.it/xoroshiro1024star.c
+     */
+
+    private static final long[] SEED = {
+        0x012de1babb3c4104L, 0xa5a818b8fc5aa503L, 0xb124ea2b701f4993L, 
0x18e0374933d8c782L,
+        0x2af8df668d68ad55L, 0x76e56f59daa06243L, 0xf58c016f0f01e30fL, 
0x8eeafa41683dbbf4L,
+        0x7bf121347c06677fL, 0x4fd0c88d25db5ccbL, 0x99af3be9ebe0a272L, 
0x94f2b33b74d0bdcbL,
+        0x24b5d9d7a00a3140L, 0x79d983d781a34a3cL, 0x582e4a84d595f5ecL, 
0x7316fe8b0f606d20L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE = {
+        0x25420431d285b339L, 0x9d50004eab73a9e9L, 0xc62fb621034dc6a6L, 
0x8e4f7ec7784c094fL,
+        0xfb233a178dddbef9L, 0x538a598a1a751e1dL, 0xb2262ac30427231cL, 
0xe782bbf13a51326dL,
+        0x503706f497e83711L, 0x8b44a684d34f4676L, 0x10228730591a6a11L, 
0x4d21c526cd1ca7c0L,
+        0x4497a82cf06b9274L, 0x20324535a7779084L, 0x20f683e744439960L, 
0xeca1ed99f04a8802L,
+        0xb0710447ff1eab59L, 0x725be21e77ae9cedL, 0x0c53e906e3c75f2dL, 
0xee3f9b042ee640cbL,
+        0xddeee0b06f807837L, 0xe7a56a2dab4ff707L, 0xc08a9562b73b0e9eL, 
0x424e42a62f21f0e0L,
+        0x93d9ef07036ace29L, 0x3389f1d557fe67c5L, 0xb6bcecf856c408d0L, 
0xed4e342feea1b9c1L,
+        0x8444c6a9d792ab55L, 0x0b75319a836a81b5L, 0x846082b4ea38f5bcL, 
0xa9e2b47baddca313L,
+        0x3f1a966bb7668740L, 0xf556b1a28a741e1dL, 0xfc99602a418d56b3L, 
0x50e51136f1ff265bL,
+        0x0b1534b756ba6913L, 0x902b3601421c7827L, 0x88a33e48fbabe7f0L, 
0xc3fdf390206a509eL,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_JUMP = {
+        0x3c9956e04f3540b4L, 0x8afdc8db489de8deL, 0xc1b843dfaf80f74fL, 
0x8af7f996ca0b43acL,
+        0xe9678ee162f4a196L, 0x64fe21412ecd8f67L, 0xa37fc756b9a58e30L, 
0x54e4943ea2256f1dL,
+        0x462b64934d76c9a9L, 0xb05141b0175a2e75L, 0x6ce6faee43a1f5a1L, 
0xaaba2a0d982ddf6fL,
+        0x2616ff8ac72434bcL, 0xd17792b5478719a6L, 0x5c5e252ff46288a4L, 
0x37d60a9cea333634L,
+        0x1d54cf05358aa8fbL, 0x1b789cbbdc91b2daL, 0xc146695af4e7b3f4L, 
0x9e18b93eea2800fcL,
+        0x8f24b7b08a478060L, 0xf9911ea6c3aee2cdL, 0x0b7c0e4de51be5aeL, 
0x5545c9e12996bd73L,
+        0x06792d509e39c6bfL, 0x35c552ab8ff34bb0L, 0xb82ba8f4110f1004L, 
0xee50f84093a0dc87L,
+        0x34428d22a60e61d3L, 0x2e873e2ee49252feL, 0x60b4c7c15833c7c1L, 
0xe509268f45253ee3L,
+        0xff9324851f9edc6fL, 0xb00abd7d8b3bfaebL, 0x5c33988f7599de27L, 
0xd131c3d1d58e79f0L,
+        0xbdd56afa4e7d3fb1L, 0x46825a94f62679b6L, 0x14e69a0ae63aa3d1L, 
0x7c3bbbc3ab5dcf6bL,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_LONG_JUMP = {
+        0x844905489c673003L, 0x346119a9080539bbL, 0xd6daab0b3d76dbfcL, 
0x779de94809667d8fL,
+        0xef431e757eb6dcdcL, 0x4afca5425c9ce0d6L, 0x2d3346e5d4e5b904L, 
0xdf8c0c75d449c9b7L,
+        0xce8901ef4341c557L, 0x4d9c8ce74919d511L, 0xa0c9b66bf8151b0eL, 
0xf27e867e82ba9960L,
+        0x7fbe6396e871808bL, 0x05b986f7cd526c2aL, 0x69486c6bd10e5528L, 
0xec5b81a2983edceeL,
+        0x386c3e25b2c97169L, 0xb93097d01f6f2dc3L, 0x6d1de2eca99e0075L, 
0x4fa5bb372448ef65L,
+        0x59a7f43fb5667effL, 0x473aef023223d925L, 0x7960ff90dd9faf6aL, 
0xd6a52f1010fc621dL,
+        0xae0475c0252706feL, 0x04b18a9676b43b1fL, 0x23614d123c1d7981L, 
0x90a3a61d347af01dL,
+        0xa8bb5a73ed60fa71L, 0x9bf4aebbcef5d4dcL, 0xcb055aa09030c14eL, 
0xadb90edea65b9f10L,
+        0x18c39d4ad7d7b42bL, 0x77d582b2b6cd5b63L, 0xb1981ca7f4940a72L, 
0x3831442ccb482f24L,
+        0x290fa8a2be437eb2L, 0xcc6e9e6945d4d357L, 0xb056b5998149a15bL, 
0x14d11b85ca684993L,
+    };
+
+    @Test
+    public void testReferenceCode() {
+        RandomAssert.assertEquals(EXPECTED_SEQUENCE, new 
XoRoShiRo1024Star(SEED));
+    }
+
+    @Test
+    public void testConstructorWithZeroSeedIsNonFunctional() {
+        RandomAssert.assertNextIntZeroOutput(new XoRoShiRo1024Star(new 
long[SEED_SIZE]), 2 * SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithSingleBitSeedIsFunctional() {
+        
RandomAssert.assertLongArrayConstructorWithSingleBitSeedIsFunctional(XoRoShiRo1024Star.class,
 SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithoutFullLengthSeed() {
+        // Hit the case when the input seed is self-seeded when not full length
+        RandomAssert.assertNextLongNonZeroOutput(new XoRoShiRo1024Star(new 
long[] {SEED[0]}),
+                SEED_SIZE, SEED_SIZE);
+    }
+
+    @Test
+    public void testJump() {
+        RandomAssert.assertJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_JUMP, new XoRoShiRo1024Star(SEED));
+    }
+
+    @Test
+    public void testLongJump() {
+        RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoRoShiRo1024Star(SEED));
+    }
+}
diff --git 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java
 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java
new file mode 100644
index 0000000..dd3af12
--- /dev/null
+++ 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoRoShiRo128PlusPlusTest.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.rng.core.source64;
+
+import org.apache.commons.rng.core.RandomAssert;
+import org.junit.Test;
+
+public class XoRoShiRo128PlusPlusTest {
+    /** The size of the array SEED. */
+    private static final int SEED_SIZE = 2;
+
+    /*
+     * Data from running the executable compiled from the author's C code:
+     *   http://xorshift.di.unimi.it/xorshift1024star.c
+     */
+
+    private static final long[] SEED = {
+        0x012de1babb3c4104L, 0xa5a818b8fc5aa503L
+    };
+
+    private static final long[] EXPECTED_SEQUENCE = {
+        0xf61550e8874b8eafL, 0x125015fce911e8f6L, 0xff0e6030e39af1a4L, 
0xd5738fc2a502673bL,
+        0xef48cdcbefd84325L, 0xb60462c014133da1L, 0xa62c6d8b9f87cd81L, 
0x52fd609a347198ebL,
+        0x3c717475e803bf09L, 0x1b6e66b21504a677L, 0x528f64243db486f4L, 
0x3676015c33fbf0faL,
+        0x3e05f2ea0216a127L, 0x373343bb4159fa59L, 0xc375c54ebe2f9097L, 
0x52d85b22744e0574L,
+        0x055dd7e34e687524L, 0xb749afc4bc4ed98aL, 0x31b972f93d117746L, 
0xc0e13329779abc15L,
+        0xee52ec4b4ddc0091L, 0xc756c7dd1d6796d6L, 0x3ce47f42e211c63eL, 
0xa635aa7ce5d06101L,
+        0xe8054178cbb492c1L, 0x3cc3ad122e7da816L, 0x0cbad73cdacab8fdL, 
0x20aa1cbc64638b31L,
+        0x3bce572cfe3bc776L, 0xcc81e41637090cd8L, 0x69cc93e599f51181L, 
0x2d5c9a4e509f984dL,
+        0xf4f3bf08ff627f92L, 0x3430e0a0e8670235L, 0x75a856b68968f466L, 
0xdee1dbbb374913d7L,
+        0x9736e33202fbe05bL, 0x4bea0cc1151902a4L, 0x9fe7fd9d8de47d13L, 
0xf011332584a1c7abL,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_JUMP = {
+        0xd0247ffd625d34bbL, 0x5247d11117b07db9L, 0xb9aec11eefe737e1L, 
0xa88d6ac4c2d7f480L,
+        0x876e38fc5bcd7f89L, 0x14aece3dfd7a6ce9L, 0x6a7d54fb077757c9L, 
0x4b295874fd6e600aL,
+        0x7efc54a81a770ffbL, 0xba3e5563f7fe8921L, 0x2239e13c7e891f63L, 
0xb55fe548136c7487L,
+        0x9c25f74da0d8ee56L, 0xf0394d67496e5365L, 0x66825f2ecdf8dd31L, 
0x4556f285a8ddf1e5L,
+        0xe36263a4651b8713L, 0xe71d97594e1fcbf4L, 0x85e29bc51ade5500L, 
0x29072f022acf4424L,
+        0x5a6ad132ebe0e3acL, 0x27636b07bd1d0589L, 0x4bea854864d0b254L, 
0x9067b3ebd340445cL,
+        0x8efb0e541cf4748dL, 0x77ac4cf8b2c52130L, 0x3e6d153c3fd9d216L, 
0x133f5b6cb6113ae4L,
+        0xb412087ed3fc5f2bL, 0xaf452866aed4f35fL, 0x18f5416acb6e5e7cL, 
0x98efa7dd2825dd3eL,
+        0x4741ee086b0c21b8L, 0x83bee0e266ace631L, 0x1365249d567dd250L, 
0xe249e3e3531ce4e5L,
+        0xc731814bfb74fb0dL, 0x7e787fed6a4867a6L, 0xd5dcb4243d5e99b5L, 
0x814f448f602da27aL,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_LONG_JUMP = {
+        0x6df051506844df28L, 0x82b35c7bdbfaf5d1L, 0x4777df68763da907L, 
0xcce5e8b9296d60a4L,
+        0xbc6c9ad115aeca29L, 0xc07d256e39f80780L, 0xf8ff8370f70e7a3cL, 
0x7febc84171245a56L,
+        0x81d2666d50e5025aL, 0x6bb05ddc3eba6542L, 0x9ee3a1141dec8267L, 
0x699d68881fa2a2b3L,
+        0xd4a22412b7a931f1L, 0x806e870d51a5de43L, 0xf3c9392aca6b5165L, 
0x0336ef0f76d4bbe3L,
+        0xa64aee05112a7bafL, 0x00d4e91ecda4e9efL, 0x72d6f199a63bae80L, 
0x3e3fe49a3e9d3c16L,
+        0x8d01430dcfbbaf88L, 0x7c251ea9025494beL, 0x6f9d95802f2b73d4L, 
0x77940cc33cb6d44bL,
+        0xa2923dd106c5a575L, 0x7a40e2608ecc4156L, 0xabab85f8f1f0ac30L, 
0x7d46384e68e42393L,
+        0xe51135892364edabL, 0x30a6d989c2e1ce8cL, 0xe3a5ca50ef05e784L, 
0xb166f894ee83ee6cL,
+        0x8034b69518bda95aL, 0xbf47c48eb7a25d81L, 0x6661fd8cc91ba9cfL, 
0x0bbc9b1b8dd65082L,
+        0xd15af2be53778c09L, 0x5167f22075802d3cL, 0x76c2c76784ba1941L, 
0x9e79d12a7bb75038L,
+    };
+
+    @Test
+    public void testReferenceCode() {
+        RandomAssert.assertEquals(EXPECTED_SEQUENCE, new 
XoRoShiRo128PlusPlus(SEED));
+    }
+
+    @Test
+    public void testConstructorWithZeroSeedIsNonFunctional() {
+        RandomAssert.assertNextIntZeroOutput(new XoRoShiRo128PlusPlus(new 
long[SEED_SIZE]), 2 * SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithSingleBitSeedIsFunctional() {
+        
RandomAssert.assertLongArrayConstructorWithSingleBitSeedIsFunctional(XoRoShiRo128PlusPlus.class,
 SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithoutFullLengthSeed() {
+        // Hit the case when the input seed is self-seeded when not full length
+        RandomAssert.assertNextLongNonZeroOutput(new XoRoShiRo128PlusPlus(new 
long[] {SEED[0]}),
+                SEED_SIZE, SEED_SIZE);
+    }
+
+    @Test
+    public void testElementConstructor() {
+        final XoRoShiRo128PlusPlus rng1 = new XoRoShiRo128PlusPlus(SEED);
+        final XoRoShiRo128PlusPlus rng2 = new XoRoShiRo128PlusPlus(SEED[0], 
SEED[1]);
+        RandomAssert.assertNextLongEquals(SEED.length * 2, rng1, rng2);
+    }
+
+    @Test
+    public void testJump() {
+        RandomAssert.assertJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_JUMP, new XoRoShiRo128PlusPlus(SEED));
+    }
+
+    @Test
+    public void testLongJump() {
+        RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoRoShiRo128PlusPlus(SEED));
+    }
+}
diff --git 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlusTest.java
 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlusTest.java
new file mode 100644
index 0000000..9d6fd16
--- /dev/null
+++ 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo256PlusPlusTest.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.rng.core.source64;
+
+import org.apache.commons.rng.core.RandomAssert;
+import org.junit.Test;
+
+public class XoShiRo256PlusPlusTest {
+    /** The size of the array SEED. */
+    private static final int SEED_SIZE = 4;
+
+    /*
+     * Data from running the executable compiled from the author's C code:
+     *   http://xoshiro.di.unimi.it/xoshiro256plusplus.c
+     */
+
+    private static final long[] SEED = {
+        0x012de1babb3c4104L, 0xa5a818b8fc5aa503L, 0xb124ea2b701f4993L, 
0x18e0374933d8c782L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE = {
+        0x83256c3efe494810L, 0xb6a32c7a2f427e87L, 0xea4a4faa5f25c89cL, 
0xbc7eccdda31316ccL,
+        0x13fd0f7150d989c6L, 0x547138cbae221c4bL, 0x9a2ed08e202ccdd4L, 
0x71c76beffd5ffaf7L,
+        0x4a82a53f9bf0e159L, 0x82b8fee551e226f6L, 0xc8a7cb2002fbabd2L, 
0xe9fd4b8e8420b6caL,
+        0xc4fee10ff73a4513L, 0xbeee1386595fd5bbL, 0x1ca9ea9f7af81173L, 
0x1182e0f6515e7a82L,
+        0x92f033c288c73349L, 0xf929b1c910f5d6fdL, 0xd74f135a22456c58L, 
0x5db7c5f1bab2ba95L,
+        0x35bd2e90555e90ffL, 0x82f57164f0a873e8L, 0xfe8c06ad1f4322a3L, 
0xb5830910972042f4L,
+        0x01b098fccc86e9a1L, 0x0a401cbff79d2968L, 0xaee758e14fc8b6c4L, 
0x9b69b1669c551c7bL,
+        0xc424e07de89d8003L, 0x2f54c2bc2413685cL, 0x18ed020132f7fd78L, 
0x1296df883b21ddb7L,
+        0x08ce35eb04245592L, 0x5b379c8c2a13dd1fL, 0xd5d72bff230d0038L, 
0xe8fa9e75a5b11653L,
+        0x01cda02ee361fc5dL, 0x458c1ba437db0e66L, 0x653d400afec2f1a5L, 
0xce41edefbfc16d19L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_JUMP = {
+        0x097817815ff7650eL, 0xe3a4a1ba31fe551cL, 0xd7edac1f857eb72eL, 
0xeaf103ab604c1f33L,
+        0x274bf134459253efL, 0xb2c037e04c354378L, 0x42f0d50f53d01cfaL, 
0x170b7b0992291c41L,
+        0xab2f51abd6144ce5L, 0xb1b29ec57f17c875L, 0xeee5b6846ef8731fL, 
0xc93a9a89f885741bL,
+        0xeb2c0ef80f38209aL, 0x8b11ae67b295bf5dL, 0x102ff04bf5f6a514L, 
0x011491b4c8d59849L,
+        0xd949e7c675fa13e0L, 0xf03f2b6bb95f63dfL, 0x0394a28de3853a88L, 
0xc6bf4defddf657b3L,
+        0x137edf82bc6da988L, 0xdd3da2a860fe7aaaL, 0xd562a0fceb57f6cfL, 
0x7ad187b77b82ed41L,
+        0xcee517096675814bL, 0x9cb90e61cd248c36L, 0x08e7d20e76147477L, 
0xeb3be1e1fa580f29L,
+        0xed5803c04e7f457dL, 0x57736d360cf9b389L, 0xf98478390475f655L, 
0x077fe75d911a51d2L,
+        0x0acd5c157adfb636L, 0x4e17872ccc3d84b0L, 0x9e31d8f0e2943738L, 
0xaaee22c711ec0602L,
+        0x48998bdfa462be6dL, 0xff066ab2d6250e56L, 0xe319e9c2ab1ad697L, 
0x2b14627b78929b4aL,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_LONG_JUMP = {
+        0x0a6b9e34dbf9c7caL, 0x2214a78c97dc2187L, 0x9f44832a1e1ba9c6L, 
0x49f5a7c5d1618518L,
+        0xbca9ab8bed062466L, 0x21da06a34efaf84aL, 0xfc22b0fe3dda8c05L, 
0x9b85b0b6cfc93dafL,
+        0x252992459938a6c2L, 0x57e8cc4f4dd5316cL, 0x7942b8174c68b3f7L, 
0x0687eb4b9902d56cL,
+        0x76c25e3f67a134b1L, 0x9b4a908b5fc601e4L, 0x28019ff6b951f9baL, 
0xb23ce81de5d3e05dL,
+        0x44908a02c9cacabcL, 0xf527591a7870712dL, 0x4c8647740ac64a92L, 
0xbf51a8298a198b8dL,
+        0x2a899624fd875afdL, 0xbd9806ef5269c9bfL, 0xd75990e2678307c8L, 
0x2984ae7ce86bcbdcL,
+        0x948a1a74b031559cL, 0xf560ffba9a474a3cL, 0x8c82a4075190e936L, 
0x1735d50cb3619419L,
+        0x488716879f534f96L, 0x359aadcdd6a5d5adL, 0x314e31dac415bc2bL, 
0x066cb902db3e6bb9L,
+        0xd4d8c53a90d7480dL, 0x721670f7e471039fL, 0x0d7193e03567d61cL, 
0xdb6d987c352b9fd0L,
+        0x3c22102b526bff0cL, 0x24836afdeaab511eL, 0x9f098d3918b5fd3cL, 
0x1f6c643f8a0b8c1dL,
+    };
+
+    @Test
+    public void testReferenceCode() {
+        RandomAssert.assertEquals(EXPECTED_SEQUENCE, new 
XoShiRo256PlusPlus(SEED));
+    }
+
+    @Test
+    public void testConstructorWithZeroSeedIsNonFunctional() {
+        RandomAssert.assertNextIntZeroOutput(new XoShiRo256PlusPlus(new 
long[SEED_SIZE]), 2 * SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithSingleBitSeedIsFunctional() {
+        
RandomAssert.assertLongArrayConstructorWithSingleBitSeedIsFunctional(XoShiRo256PlusPlus.class,
 SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithoutFullLengthSeed() {
+        // Hit the case when the input seed is self-seeded when not full length
+        RandomAssert.assertNextLongNonZeroOutput(new XoShiRo256PlusPlus(new 
long[] {SEED[0]}),
+                SEED_SIZE, SEED_SIZE);
+    }
+
+    @Test
+    public void testElementConstructor() {
+        final XoShiRo256PlusPlus rng1 = new XoShiRo256PlusPlus(SEED);
+        final XoShiRo256PlusPlus rng2 = new XoShiRo256PlusPlus(SEED[0], 
SEED[1], SEED[2], SEED[3]);
+        RandomAssert.assertNextLongEquals(SEED.length * 2, rng1, rng2);
+    }
+
+    @Test
+    public void testJump() {
+        RandomAssert.assertJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_JUMP, new XoShiRo256PlusPlus(SEED));
+    }
+
+    @Test
+    public void testLongJump() {
+        RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoShiRo256PlusPlus(SEED));
+    }
+}
diff --git 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlusTest.java
 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlusTest.java
new file mode 100644
index 0000000..68310a8
--- /dev/null
+++ 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo512PlusPlusTest.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.rng.core.source64;
+
+import org.apache.commons.rng.core.RandomAssert;
+import org.junit.Test;
+
+public class XoShiRo512PlusPlusTest {
+    /** The size of the array SEED. */
+    private static final int SEED_SIZE = 8;
+
+    /*
+     * Data from running the executable compiled from the author's C code:
+     *   http://xoshiro.di.unimi.it/xoshiro512plusplus.c
+     */
+
+    private static final long[] SEED = {
+        0x012de1babb3c4104L, 0xa5a818b8fc5aa503L, 0xb124ea2b701f4993L, 
0x18e0374933d8c782L,
+        0x2af8df668d68ad55L, 0x76e56f59daa06243L, 0xf58c016f0f01e30fL, 
0x8eeafa41683dbbf4L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE = {
+        0x48f140e2854eae38L, 0x88d80a53206851ecL, 0xf1d255641f3ae3b3L, 
0x0f4f285abdd594d8L,
+        0x143218246037a643L, 0xee38ae788815d8e2L, 0xb034afe60cf3bf1eL, 
0x6ebe40961af2ac91L,
+        0x5dafb9e849412600L, 0xbf27348ef757e243L, 0x469345ef2d21ee91L, 
0x4f2f7b8e0ab1c23cL,
+        0xfb6f8d5eeaba7c82L, 0x0d95bd0852a4ae70L, 0xec95e0448516b491L, 
0xa6c62460124a0036L,
+        0xc206ef6cfb672cd8L, 0xa8339b4fdf8111a5L, 0xa267bc4646c60968L, 
0x149f8c339958964fL,
+        0xea140efc2121e5faL, 0xbb274991873c8148L, 0xee6c77038d610dbaL, 
0xebaab9379277d787L,
+        0x3966eb686a44bb24L, 0x54bb61aa4003b069L, 0xcde854e91cc2cb30L, 
0x1f8f8f30b896c2e5L,
+        0x50b15f5e42bc2517L, 0x2f6695e6dc48d57aL, 0x35a4c31375a7b365L, 
0x9927e1adf43ee3c2L,
+        0xe99ffb0a8dac464cL, 0x41816340c01c96d6L, 0x8f5ebe34bcadcc8cL, 
0x3099b1ac7bba1f73L,
+        0x74ad51e9c17ca276L, 0xc8a871271ab601baL, 0x659aa958c902a843L, 
0x741516f44b750698L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_JUMP = {
+        0x3490d35943b71b6eL, 0x1381f9435a364888L, 0x583be5b08408e06cL, 
0x96d9ebeb8441d875L,
+        0x33fb5086bca9477dL, 0x54a1318e630e3206L, 0x28d51480f6c0fc26L, 
0xfc55a9d294c5d9d3L,
+        0x5d2e6bf2d7a8b758L, 0x2cd5f8233e87db70L, 0x1c2b1fe36201510fL, 
0xd6178211474796f9L,
+        0x5897035554f9057bL, 0x6088bb64660e1d51L, 0x98e07f6c6a499cb9L, 
0x98f9bd3445a33f43L,
+        0x0c28666f552423bdL, 0xb8f19aa7fdb89c1aL, 0x548713e79008b073L, 
0x61d2bbb14a0f3bc1L,
+        0x917ec60de3ffb14eL, 0xd1fe8d6f37b9bd70L, 0x162531e606e234edL, 
0x4f83a041b08cf330L,
+        0xc38ddec5d5179651L, 0x27e89ca3ddf9428bL, 0x14800d12f9ca493aL, 
0x0dab376fd3d4d190L,
+        0xe1e9f6789280e16dL, 0x39025d8c68e4bf32L, 0x8112964847bb7f20L, 
0x9c27cab74ab44154L,
+        0xdf2ecc32a56b4f74L, 0x1b520df69792caacL, 0x1bf881006d0bf761L, 
0x25b263716b101941L,
+        0xd8d54d4602dd3719L, 0x7e6afa6cf20adcdcL, 0x4468886c474bc7bdL, 
0x95aabb6847f69f47L,
+    };
+
+    private static final long[] EXPECTED_SEQUENCE_AFTER_LONG_JUMP = {
+        0x218b3c94697bfd62L, 0xe2b22013826bfbcbL, 0xca92e100129f73cdL, 
0x401313c6b39a0f61L,
+        0x595926c839e29f64L, 0x1f95ce075d9009bdL, 0x54f0f8f0f8389f19L, 
0x788a0c369131e765L,
+        0x8d4a94df5837ac36L, 0xfe01e5ede70ca81eL, 0xc5e3709b662ae8ecL, 
0x541f3cd991d5602bL,
+        0xcc313c38ccb11f6fL, 0xa97ccc8f19546e0dL, 0x93c3808953be0ea7L, 
0x89fdac3da0e315a6L,
+        0xdd979f2ae97e8b4aL, 0x74fb917f5bdec895L, 0x2ac64ab3d6672713L, 
0x72bc49a21ede60e0L,
+        0x9ec32cacadd5e908L, 0x90d7b30c1abe35a2L, 0x332bc85a538edc63L, 
0xf91e8b31e02fdf2bL,
+        0xed40aee6f7cd0201L, 0x1bbf20497f99c4eaL, 0x390994ea6c7430bfL, 
0xcb5c702a5f827df3L,
+        0xe21c537cda1abddfL, 0xefdbd8500965fd8bL, 0x9f8c363e8824e1eeL, 
0x70bb6b5670253cdcL,
+        0x271cdbf6954126dbL, 0xf1942493c16240a7L, 0xfc7ad4185188e39dL, 
0x0726ee3787d4b389L,
+        0x637d2aac6c82ff5fL, 0xdd00930da7790bf0L, 0xd3b37aa49732fe48L, 
0x60a0f58457ed68a0L,
+    };
+
+    @Test
+    public void testReferenceCode() {
+        RandomAssert.assertEquals(EXPECTED_SEQUENCE, new 
XoShiRo512PlusPlus(SEED));
+    }
+
+    @Test
+    public void testConstructorWithZeroSeedIsNonFunctional() {
+        RandomAssert.assertNextIntZeroOutput(new XoShiRo512PlusPlus(new 
long[SEED_SIZE]), 2 * SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithSingleBitSeedIsFunctional() {
+        
RandomAssert.assertLongArrayConstructorWithSingleBitSeedIsFunctional(XoShiRo512PlusPlus.class,
 SEED_SIZE);
+    }
+
+    @Test
+    public void testConstructorWithoutFullLengthSeed() {
+        // Hit the case when the input seed is self-seeded when not full length
+        RandomAssert.assertNextLongNonZeroOutput(new XoShiRo512PlusPlus(new 
long[] {SEED[0]}),
+                SEED_SIZE, SEED_SIZE);
+    }
+
+    @Test
+    public void testElementConstructor() {
+        final XoShiRo512PlusPlus rng1 = new XoShiRo512PlusPlus(SEED);
+        final XoShiRo512PlusPlus rng2 = new XoShiRo512PlusPlus(SEED[0], 
SEED[1], SEED[2], SEED[3],
+                                                               SEED[4], 
SEED[5], SEED[6], SEED[7]);
+        RandomAssert.assertNextLongEquals(SEED.length * 2, rng1, rng2);
+    }
+
+    @Test
+    public void testJump() {
+        RandomAssert.assertJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_JUMP, new XoShiRo512PlusPlus(SEED));
+    }
+
+    @Test
+    public void testLongJump() {
+        RandomAssert.assertLongJumpEquals(EXPECTED_SEQUENCE, 
EXPECTED_SEQUENCE_AFTER_LONG_JUMP, new XoShiRo512PlusPlus(SEED));
+    }
+}
diff --git 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo512StarStarTest.java
 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo512StarStarTest.java
index 8334ad4..610dab6 100644
--- 
a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo512StarStarTest.java
+++ 
b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source64/XoShiRo512StarStarTest.java
@@ -59,7 +59,6 @@ public class XoShiRo512StarStarTest {
         0x2f1f49ee5e1d5207L, 0xafca316bd4672318L, 0x91e9df4fe8cb3cddL, 
0x8857a767c3a1d387L,
     };
 
-
     private static final long[] EXPECTED_SEQUENCE_AFTER_LONG_JUMP = {
         0x1d1aaa6cb41463c7L, 0xf37f8d9edc99e22fL, 0xa9f678cc5b0519acL, 
0xcfe2d9024aede22fL,
         0x1ba8d18326d7c87eL, 0xcdd7d8c3fcc9d409L, 0x270738c721177babL, 
0xaebe345f36cbfef9L,

Reply via email to