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 e03d15129f6f0324b787446dbbd1e2fb72adb5f7 Author: aherbert <aherb...@apache.org> AuthorDate: Mon Aug 5 13:22:38 2019 +0100 RNG-85: Add custom nextLong() implementation to MSWS generator. --- .../rng/core/source32/MiddleSquareWeylSequence.java | 15 +++++++++++++++ .../rng/core/source32/MiddleSquareWeylSequenceTest.java | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequence.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequence.java index b84cd47..1df971e 100644 --- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequence.java +++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequence.java @@ -119,4 +119,19 @@ public class MiddleSquareWeylSequence extends IntProvider { x += w += s; return (int) (x = (x >>> 32) | (x << 32)); } + + /** {@inheritDoc} */ + @Override + public long nextLong() { + // Avoid round trip from long to int to long by performing two iterations inline + x *= x; + x += w += s; + final long i1 = x & 0xffffffff00000000L; + x = (x >>> 32) | (x << 32); + x *= x; + x += w += s; + final long i2 = x >>> 32; + x = i2 | x << 32; + return i1 | i2; + } } diff --git a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequenceTest.java b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequenceTest.java index 7a6c590..e9cde90 100644 --- a/commons-rng-core/src/test/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequenceTest.java +++ b/commons-rng-core/src/test/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequenceTest.java @@ -17,6 +17,8 @@ package org.apache.commons.rng.core.source32; import org.apache.commons.rng.core.RandomAssert; +import org.apache.commons.rng.core.util.NumberFactory; +import org.junit.Assert; import org.junit.Test; public class MiddleSquareWeylSequenceTest { @@ -78,4 +80,19 @@ public class MiddleSquareWeylSequenceTest { final MiddleSquareWeylSequence rng = new MiddleSquareWeylSequence(new long[0]); rng.nextInt(); } + + /** + * Test nextLong() returns two nextInt() values joined together. This tests the custom + * nextLong() routine in the implementation that overrides the default. + */ + @Test + public void testNextLong() { + final long[] seed = {0x012de1babb3c4104L, 0xc8161b4202294965L, 0xb5ad4eceda1ce2a9L}; + final MiddleSquareWeylSequence rng1 = new MiddleSquareWeylSequence(seed); + final MiddleSquareWeylSequence rng2 = new MiddleSquareWeylSequence(seed); + for (int i = 0; i < 50; i++) { + Assert.assertEquals(NumberFactory.makeLong(rng1.nextInt(), rng1.nextInt()), + rng2.nextLong()); + } + } }