You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2019/08/06 10:42:28 UTC

[commons-rng] 05/07: RNG-85: Add custom nextLong() implementation to MSWS generator.

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 <ah...@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());
+        }
+    }
 }