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