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


The following commit(s) were added to refs/heads/master by this push:
     new a14cf2ee RNG-192: Remove use of overriddable instance method for state 
initialisation
a14cf2ee is described below

commit a14cf2eec3cb392193c7be746c6ebdecead32551
Author: Alex Herbert <[email protected]>
AuthorDate: Tue Apr 14 18:07:16 2026 +0100

    RNG-192: Remove use of overriddable instance method for state
    initialisation
---
 commons-rng-core/pom.xml                                  |  1 +
 .../java/org/apache/commons/rng/core/BaseProvider.java    | 12 ++++++++++--
 .../apache/commons/rng/core/source32/AbstractPcg6432.java |  8 +-------
 .../commons/rng/core/source32/AbstractXoRoShiRo64.java    |  8 +-------
 .../commons/rng/core/source32/AbstractXoShiRo128.java     |  8 +-------
 .../core/source32/DotyHumphreySmallFastCounting32.java    |  8 +-------
 .../org/apache/commons/rng/core/source32/KISSRandom.java  |  3 +--
 .../commons/rng/core/source32/MultiplyWithCarry256.java   |  3 +--
 .../commons/rng/core/source64/AbstractXoRoShiRo1024.java  | 15 ++-------------
 .../commons/rng/core/source64/AbstractXoRoShiRo128.java   |  8 +-------
 .../commons/rng/core/source64/AbstractXoShiRo256.java     |  8 +-------
 .../commons/rng/core/source64/AbstractXoShiRo512.java     |  8 +-------
 .../core/source64/DotyHumphreySmallFastCounting64.java    |  8 +-------
 .../org/apache/commons/rng/core/source64/PcgRxsMXs64.java |  8 +-------
 .../commons/rng/core/source64/XorShift1024Star.java       | 15 ++-------------
 src/changes/changes.xml                                   |  5 +++++
 16 files changed, 31 insertions(+), 95 deletions(-)

diff --git a/commons-rng-core/pom.xml b/commons-rng-core/pom.xml
index c6fc94fc..6738d63e 100644
--- a/commons-rng-core/pom.xml
+++ b/commons-rng-core/pom.xml
@@ -56,6 +56,7 @@
     <commons.jacoco.instructionRatio>0.99</commons.jacoco.instructionRatio>
     <commons.jacoco.lineRatio>0.99</commons.jacoco.lineRatio>
     <!-- Change from commons-parent of 1.0 as method handles to JDK Math 
cannot always be executed -->
+    <commons.jacoco.branchRatio>0.99</commons.jacoco.branchRatio>
     <commons.jacoco.methodRatio>0.99</commons.jacoco.methodRatio>
     <commons.jacoco.complexityRatio>0.99</commons.jacoco.complexityRatio>
 
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/BaseProvider.java 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/BaseProvider.java
index 55ad5e88..5fb4a346 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/BaseProvider.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/BaseProvider.java
@@ -174,6 +174,10 @@ public abstract class BaseProvider
      *  </li>
      * </ol>
      *
+     * <p>Note: It is not recommended to use this method from a constructor
+     * as it can be overridden by subclasses possibly leading to unexpected 
behaviour.
+     * Future versions may remove this method, or change it to static.
+     *
      * @param state State. Must be allocated.
      * @param seed Seed. Cannot be null.
      */
@@ -185,7 +189,7 @@ public abstract class BaseProvider
 
         if (seedSize < stateSize) {
             for (int i = seedSize; i < stateSize; i++) {
-                state[i] = (int) scrambleWell(state[i - seed.length], i);
+                state[i] = (int) scrambleWell(state[i - seedSize], i);
             }
         }
     }
@@ -205,6 +209,10 @@ public abstract class BaseProvider
      *  </li>
      * </ol>
      *
+     * <p>Note: It is not recommended to use this method from a constructor
+     * as it can be overridden by subclasses possibly leading to unexpected 
behaviour.
+     * Future versions may remove this method, or change it to static.
+     *
      * @param state State. Must be allocated.
      * @param seed Seed. Cannot be null.
      */
@@ -216,7 +224,7 @@ public abstract class BaseProvider
 
         if (seedSize < stateSize) {
             for (int i = seedSize; i < stateSize; i++) {
-                state[i] = scrambleWell(state[i - seed.length], i);
+                state[i] = scrambleWell(state[i - seedSize], i);
             }
         }
     }
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractPcg6432.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractPcg6432.java
index 8ca5b7ae..fb5215fd 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractPcg6432.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractPcg6432.java
@@ -94,13 +94,7 @@ abstract class AbstractPcg6432 extends IntProvider {
      * is discarded by left shift and the increment is set to odd.</p>
      */
     AbstractPcg6432(long[] seed) {
-        if (seed.length < SEED_SIZE) {
-            final long[] tmp = new long[SEED_SIZE];
-            fillState(tmp, seed);
-            setSeedInternal(tmp);
-        } else {
-            setSeedInternal(seed);
-        }
+        setSeedInternal(extendSeed(seed, SEED_SIZE));
     }
 
     /**
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
index b1f23345..c97682f5 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoRoShiRo64.java
@@ -46,13 +46,7 @@ abstract class AbstractXoRoShiRo64 extends IntProvider {
      * set. A seed containing all zeros will create a non-functional generator.
      */
     AbstractXoRoShiRo64(int[] seed) {
-        if (seed.length < SEED_SIZE) {
-            final int[] state = new int[SEED_SIZE];
-            fillState(state, seed);
-            setState(state);
-        } else {
-            setState(seed);
-        }
+        setState(extendSeed(seed, SEED_SIZE));
     }
 
     /**
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
index f44704ec..7edc3f03 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/AbstractXoShiRo128.java
@@ -61,13 +61,7 @@ abstract class AbstractXoShiRo128 extends IntProvider 
implements LongJumpableUni
      * set. A seed containing all zeros will create a non-functional generator.
      */
     AbstractXoShiRo128(int[] seed) {
-        if (seed.length < SEED_SIZE) {
-            final int[] state = new int[SEED_SIZE];
-            fillState(state, seed);
-            setState(state);
-        } else {
-            setState(seed);
-        }
+        setState(extendSeed(seed, SEED_SIZE));
     }
 
     /**
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/DotyHumphreySmallFastCounting32.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/DotyHumphreySmallFastCounting32.java
index ab7c0483..d25b5070 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/DotyHumphreySmallFastCounting32.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/DotyHumphreySmallFastCounting32.java
@@ -49,13 +49,7 @@ public class DotyHumphreySmallFastCounting32 extends 
IntProvider {
      * be used; if smaller, the remaining elements will be automatically set.
      */
     public DotyHumphreySmallFastCounting32(int[] seed) {
-        if (seed.length < SEED_SIZE) {
-            final int[] state = new int[SEED_SIZE];
-            fillState(state, seed);
-            setSeedInternal(state);
-        } else {
-            setSeedInternal(seed);
-        }
+        setSeedInternal(extendSeed(seed, SEED_SIZE));
     }
 
     /**
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/KISSRandom.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/KISSRandom.java
index aab3ff42..f88d5686 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/KISSRandom.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/KISSRandom.java
@@ -81,8 +81,7 @@ public class KISSRandom extends IntProvider {
     private void setSeedInternal(int[] seed) {
         // Reset the whole state of this RNG (i.e. the 4 state variables).
         // Filling procedure is not part of the reference code.
-        final int[] tmp = new int[SEED_SIZE];
-        fillState(tmp, seed);
+        final int[] tmp = extendSeed(seed, SEED_SIZE);
 
         z = tmp[0];
         w = tmp[1];
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MultiplyWithCarry256.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MultiplyWithCarry256.java
index 9418807d..4a984887 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MultiplyWithCarry256.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MultiplyWithCarry256.java
@@ -91,8 +91,7 @@ public class MultiplyWithCarry256 extends IntProvider {
     private void setSeedInternal(int[] seed) {
         // Reset the whole state of this RNG (i.e. "state" and "index").
         // Filling procedure is not part of the reference code.
-        final int[] tmp = new int[SEED_SIZE];
-        fillState(tmp, seed);
+        final int[] tmp = extendSeed(seed, SEED_SIZE);
 
         // First element of the "seed" is the initial "carry".
         final int c = tmp[0];
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
index 04d1150b..bca30096 100644
--- 
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
@@ -62,7 +62,8 @@ abstract class AbstractXoRoShiRo1024 extends LongProvider 
implements LongJumpabl
      * set. A seed containing all zeros will create a non-functional generator.
      */
     AbstractXoRoShiRo1024(long[] seed) {
-        setSeedInternal(seed);
+        final long[] tmp = extendSeed(seed, SEED_SIZE);
+        System.arraycopy(tmp, 0, state, 0, SEED_SIZE);
     }
 
     /**
@@ -98,18 +99,6 @@ abstract class AbstractXoRoShiRo1024 extends LongProvider 
implements LongJumpabl
         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() {
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 d33fbacb..d06cfba3 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
@@ -57,13 +57,7 @@ abstract class AbstractXoRoShiRo128 extends LongProvider 
implements LongJumpable
      * set. A seed containing all zeros will create a non-functional generator.
      */
     AbstractXoRoShiRo128(long[] seed) {
-        if (seed.length < SEED_SIZE) {
-            final long[] state = new long[SEED_SIZE];
-            fillState(state, seed);
-            setState(state);
-        } else {
-            setState(seed);
-        }
+        setState(extendSeed(seed, SEED_SIZE));
     }
 
     /**
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
index 51bbdc7f..311768a6 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo256.java
@@ -61,13 +61,7 @@ abstract class AbstractXoShiRo256 extends LongProvider 
implements LongJumpableUn
      * set. A seed containing all zeros will create a non-functional generator.
      */
     AbstractXoShiRo256(long[] seed) {
-        if (seed.length < SEED_SIZE) {
-            final long[] state = new long[SEED_SIZE];
-            fillState(state, seed);
-            setState(state);
-        } else {
-            setState(seed);
-        }
+        setState(extendSeed(seed, SEED_SIZE));
     }
 
     /**
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
index 43d036f3..73d04140 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/AbstractXoShiRo512.java
@@ -71,13 +71,7 @@ abstract class AbstractXoShiRo512 extends LongProvider 
implements LongJumpableUn
      * set. A seed containing all zeros will create a non-functional generator.
      */
     AbstractXoShiRo512(long[] seed) {
-        if (seed.length < SEED_SIZE) {
-            final long[] state = new long[SEED_SIZE];
-            fillState(state, seed);
-            setState(state);
-        } else {
-            setState(seed);
-        }
+        setState(extendSeed(seed, SEED_SIZE));
     }
 
     /**
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/DotyHumphreySmallFastCounting64.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/DotyHumphreySmallFastCounting64.java
index 9ab48c4d..1f3274ab 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/DotyHumphreySmallFastCounting64.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/DotyHumphreySmallFastCounting64.java
@@ -49,13 +49,7 @@ public class DotyHumphreySmallFastCounting64 extends 
LongProvider {
      * be used; if smaller, the remaining elements will be automatically set.
      */
     public DotyHumphreySmallFastCounting64(long[] seed) {
-        if (seed.length < SEED_SIZE) {
-            final long[] state = new long[SEED_SIZE];
-            fillState(state, seed);
-            setSeedInternal(state);
-        } else {
-            setSeedInternal(seed);
-        }
+        setSeedInternal(extendSeed(seed, SEED_SIZE));
     }
 
     /**
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/PcgRxsMXs64.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/PcgRxsMXs64.java
index 5f04fe77..ddbdc0b2 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/PcgRxsMXs64.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/PcgRxsMXs64.java
@@ -72,13 +72,7 @@ public class PcgRxsMXs64 extends LongProvider {
      * is discarded by left shift and the increment is set to odd.</p>
      */
     public PcgRxsMXs64(long[] seed) {
-        if (seed.length < SEED_SIZE) {
-            final long[] tmp = new long[SEED_SIZE];
-            fillState(tmp, seed);
-            setSeedInternal(tmp);
-        } else {
-            setSeedInternal(seed);
-        }
+        setSeedInternal(extendSeed(seed, SEED_SIZE));
     }
 
     /**
diff --git 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XorShift1024Star.java
 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XorShift1024Star.java
index 01d68cf8..14675554 100644
--- 
a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XorShift1024Star.java
+++ 
b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/XorShift1024Star.java
@@ -73,7 +73,8 @@ public class XorShift1024Star extends LongProvider implements 
JumpableUniformRan
      * @since 1.3
      */
     protected XorShift1024Star(long[] seed, long multiplier) {
-        setSeedInternal(seed);
+        final long[] tmp = extendSeed(seed, SEED_SIZE);
+        System.arraycopy(tmp, 0, state, 0, SEED_SIZE);
         this.multiplier = multiplier;
     }
 
@@ -112,18 +113,6 @@ public class XorShift1024Star extends LongProvider 
implements JumpableUniformRan
         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() {
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 8d191d69..25cb1e7f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -56,6 +56,11 @@ If the output is not quite correct, check for invisible 
trailing spaces!
     <release version="1.7" date="TBD" description="
 New features, updates and bug fixes (requires Java 8).
 ">
+      <action dev="aherbert" type="update" issue="RNG-192">
+        Remove use of overriddable instance method for state initialisation 
during
+        RNG construction. This introduces a behaviour change for affected RNGs
+        initialized with a fixed seed that does not fill the entire generator 
state.
+      </action>
       <action dev="aherbert" type="update" issue="RNG-191">
         "Philox4x64": Use java.lang.invoke to dynamically call Math multiply 
high methods
         for increased performance.

Reply via email to