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.