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/06/09 12:24:54 UTC

[commons-rng] branch master updated: Add option to combine primary test generator with a second 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


The following commit(s) were added to refs/heads/master by this push:
     new be6c544  Add option to combine primary test generator with a second generator.
be6c544 is described below

commit be6c5448aed21bcbf0e415ee4e74a9ad62ff325d
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Sun Jun 9 13:24:37 2019 +0100

    Add option to combine primary test generator with a second generator.
---
 .../commons/rng/examples/stress/RNGUtils.java      | 25 ++++++++++++++++++++++
 .../rng/examples/stress/StressTestCommand.java     | 14 ++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/commons-rng-examples/examples-stress/src/main/java/org/apache/commons/rng/examples/stress/RNGUtils.java b/commons-rng-examples/examples-stress/src/main/java/org/apache/commons/rng/examples/stress/RNGUtils.java
index ab1ee17..d5d4f79 100644
--- a/commons-rng-examples/examples-stress/src/main/java/org/apache/commons/rng/examples/stress/RNGUtils.java
+++ b/commons-rng-examples/examples-stress/src/main/java/org/apache/commons/rng/examples/stress/RNGUtils.java
@@ -134,6 +134,31 @@ final class RNGUtils {
     }
 
     /**
+     * Combine the two random generators using a {@code xor} operations.
+     *
+     * <pre>{@code
+     * rng1.nextInt() ^ rng2.nextInt()
+     * }</pre>
+     *
+     * @param rng1 The first random generator.
+     * @param rng2 The second random generator.
+     * @return the combined random generator.
+     */
+    static UniformRandomProvider createXorIntProvider(final UniformRandomProvider rng1,
+                                                      final UniformRandomProvider rng2) {
+        return new IntProvider() {
+            @Override
+            public int next() {
+                return rng1.nextInt() ^ rng2.nextInt();
+            }
+
+            @Override
+            public String toString() {
+                return rng1.toString() + " ^ " + rng2.toString();
+            }
+        };
+    }
+    /**
      * Parses the argument into an object suitable for the RandomSource constructor. Supports:
      *
      * <ul>
diff --git a/commons-rng-examples/examples-stress/src/main/java/org/apache/commons/rng/examples/stress/StressTestCommand.java b/commons-rng-examples/examples-stress/src/main/java/org/apache/commons/rng/examples/stress/StressTestCommand.java
index 0209e62..6bd2241 100644
--- a/commons-rng-examples/examples-stress/src/main/java/org/apache/commons/rng/examples/stress/StressTestCommand.java
+++ b/commons-rng-examples/examples-stress/src/main/java/org/apache/commons/rng/examples/stress/StressTestCommand.java
@@ -147,6 +147,15 @@ class StressTestCommand implements Callable<Void> {
                            "ThreadLocalRandom.current().nextInt() ^ rng.nextInt()."})
     private boolean xorThreadLocalRandom;
 
+    /**
+     * Flag to indicate the output should be combined with output from a second generator.
+     */
+    @Option(names = {"--xor-rng"},
+            description = {"Combine the bits with a second generator.",
+                           "xorRng.nextInt() ^ rng.nextInt().",
+                           "Valid values: Any known RandomSource enum value."})
+    private RandomSource xorRandomSource;
+
     /** The flag to indicate a dry run. */
     @Option(names = {"--dry-run"},
             description = "Perform a dry run where the generators and output files are created " +
@@ -417,6 +426,11 @@ class StressTestCommand implements Callable<Void> {
             if (xorThreadLocalRandom) {
                 rng = RNGUtils.createThreadLocalRandomIntProvider(rng);
             }
+            if (xorRandomSource != null) {
+                rng = RNGUtils.createXorIntProvider(
+                        RandomSource.create(xorRandomSource),
+                        rng);
+            }
             if (reverseBits) {
                 rng = RNGUtils.createReverseBitsIntProvider(rng);
             }