| ~~ |
| ~~ Licensed to the Apache Software Foundation (ASF) under one or more |
| ~~ contributor license agreements. See the NOTICE file distributed with |
| ~~ this work for additional information regarding copyright ownership. |
| ~~ The ASF licenses this file to You under the Apache License, Version 2.0 |
| ~~ (the "License"); you may not use this file except in compliance with |
| ~~ the License. You may obtain a copy of the License at |
| ~~ |
| ~~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~~ |
| ~~ Unless required by applicable law or agreed to in writing, software |
| ~~ distributed under the License is distributed on an "AS IS" BASIS, |
| ~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ~~ See the License for the specific language governing permissions and |
| ~~ limitations under the License. |
| ~~ |
| |
| ----------------------------- |
| The Apache Commons RNG User Guide |
| ----------------------------- |
| |
| 1. Purpose |
| |
| <<<Commons RNG>>> provides generators of "pseudo-randomness", i.e. the |
| generators produce deterministic sequences of bytes, currently in chunks |
| of 32 (a.k.a. <<<int>>>) or 64 bits (a.k.a. <<<long>>>), depending on the |
| implementation. |
| |
| The goal was to provide an API that is simple and unencumbered with old |
| design decisions. |
| |
| The design is clean and its rationale is explained in the code and Javadoc |
| (as well as in the extensive discussions on the "Apache Commons" project's |
| mailing list). |
| |
| The code evolved during several months in order to accommodate the |
| requirements gathered from the design issues identified in the |
| <<<org.apache.commons.math3.random>>> package and the explicit design |
| goal of {{{./why_not_java_random.html}severing ties}} to <<<java.util.Random>>>. |
| |
| The library is divided into modules: |
| |
| * {{{../commons-rng-client-api/apidocs/org/apache/commons/rng/package-summary.html}Client API}} (requires Java 6) |
| |
| This module provides the |
| {{{../commons-rng-client-api/apidocs/org/apache/commons/rng/RestorableUniformRandomProvider.html}interface}} |
| to be passed as argument to a procedure that needs to access to a sequence of random numbers. |
| |
| * {{{../commons-rng-core/apidocs/org/apache/commons/rng/core/package-summary.html}Core}} (requires Java 6) |
| |
| This module contains the implementations of several generators of pseudo-random sequences of numbers. |
| Code in this module is intended to be internal to this library and no user code should access it |
| directly. |
| With the advent of {{{http://openjdk.java.net/projects/jigsaw/}Java modularization}}, it is possible |
| that future releases of the library will enforce access through the |
| {{{../commons-rng-simple/apidocs/org/apache/commons/rng/simple/RandomSource.html}RandomSource}} |
| factory. |
| |
| * {{{../commons-rng-simple/apidocs/org/apache/commons/rng/simple/package-summary.html}Simple}} (requires Java 6) |
| |
| This module provides factory methods for creating instances of all the generators implemented |
| in the <<<commons-rng-core>>> module. |
| |
| * {{{../commons-rng-sampling/apidocs/org/apache/commons/rng/sampling/package-summary.html}Sampling}} (requires Java 6) |
| |
| This module provides implementations that generate a sequence of numbers according to some |
| specified probability distribution, and utilities to sample from a generic collection of items. |
| It is an example of usage of the API provided in the <<<commons-rng-client-api>>> module. |
| |
| * Examples |
| |
| This module provides miscellaneous complete applications that illustrate usage of the library. |
| Please note that this module is not part of the library's API; no compatibility should be expected |
| in successive releases of "Commons RNG". |
| |
| As of version 1.1, the following modules are provided: |
| |
| ** <<<examples-jmh>>>: JMH benchmarking (requires Java 8) |
| |
| This module uses the {{{http://openjdk.java.net/projects/code-tools/jmh/}JMH micro-benchmark framework}} |
| in order to assess the relative performance of the generators (see tables below). |
| |
| ** <<<examples-stress>>>: Stress testing (requires Java 8) |
| |
| This module implements a wrapper that calls external tools that can assess the quality of |
| the generators by submitting their output to a battery of "stress tests" (see tables below). |
| |
| ** <<<examples-sampling>>>: Probability density (requires Java 8) |
| |
| This module contains the code that generates the data used to produce the probability density |
| plots shown in {{{./dist_density_approx.html}this userguide}}. |
| |
| ** <<<examples-jpms>>>: JPMS integration (requires Java 9) |
| |
| This module implements a dummy application that shows how to use the artefacts (produced |
| from the maven modules described above) as Java modules ({{{https://en.wikipedia.org/wiki/Java_Platform_Module_System}JPMS}}). |
| |
| ** <<<examples-quadrature>>>: Quadrature (requires Java 8) |
| |
| This module contains an application that estimates the number 𝞹 using quasi-Montecarlo integration. |
| |
| [] |
| |
| [] |
| |
| |
| 2. Usage overview |
| |
| Please refer to the generated documentation (of the appropriate module) |
| for details on the API illustrated by the following examples. |
| |
| |
| * Random number generator objects are instantiated through factory |
| methods defined in <<<RandomSource>>>, an <<<enum>>> that declares |
| {{{../commons-rng-simple/apidocs/org/apache/commons/rng/simple/RandomSource.html#enum.constant.detail}all the available implementations}}. |
| |
| +--------------------------+ |
| import org.apache.commons.rng.UniformRandomProvider; |
| import org.apache.commons.rng.simple.RandomSource; |
| |
| UniformRandomProvider rng = RandomSource.create(RandomSource.MT); |
| +--------------------------+ |
| |
| |
| * A generator will return a randomly selected element from a range |
| of possible values of some Java (primitive) type. |
| |
| +--------------------------+ |
| boolean isOn = rng.nextBoolean(); // "true" or "false". |
| +--------------------------+ |
| +--------------------------+ |
| int n = rng.nextInt(); // Integer.MIN_VALUE <= n <= Integer.MAX_VALUE. |
| int m = rng.nextInt(max); // 0 <= m < max. |
| +--------------------------+ |
| +--------------------------+ |
| long n = rng.nextLong(); // Long.MIN_VALUE <= n <= Long.MAX_VALUE. |
| long m = rng.nextLong(max); // 0 <= m < max. |
| +--------------------------+ |
| +--------------------------+ |
| float x = rng.nextFloat(); // 0 <= x < 1. |
| +--------------------------+ |
| +--------------------------+ |
| double x = rng.nextDouble(); // 0 <= x < 1. |
| +--------------------------+ |
| |
| |
| * A generator will fill a given <<<byte>>> array with random values. |
| |
| +--------------------------+ |
| byte[] a = new byte[47]; |
| // The elements of "a" are replaced with random values from the interval [-128, 127]. |
| rng.nextBytes(a); |
| +--------------------------+ |
| +--------------------------+ |
| byte[] a = new byte[47]; |
| // Replace 3 elements of the array (at indices 15, 16 and 17) with random values. |
| rng.nextBytes(a, 15, 3); |
| +--------------------------+ |
| |
| |
| * In order to generate reproducible sequences, generators must be instantiated with a user-defined seed. |
| |
| +--------------------------+ |
| UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64, 5776); |
| +--------------------------+ |
| |
| If no seed is passed, a random seed is generated implicitly. |
| |
| Convenience methods are provided for explicitly generating random seeds of the various types. |
| |
| +--------------------------+ |
| int seed = RandomSource.createInt(); |
| +--------------------------+ |
| +--------------------------+ |
| long seed = RandomSource.createLong(); |
| +--------------------------+ |
| +--------------------------+ |
| int[] seed = RandomSource.createIntArray(128); // Length of returned array is 128. |
| +--------------------------+ |
| +--------------------------+ |
| long[] seed = RandomSource.createLongArray(128); // Length of returned array is 128. |
| +--------------------------+ |
| |
| |
| * Any of the following types can be passed to the <<<create>>> method as the "seed" argument: |
| |
| ** <<<int>>> or <<<Integer>>> |
| |
| ** <<<long>>> or <<<Long>>> |
| |
| ** <<<int[]>>> |
| |
| ** <<<long[]>>> |
| |
| ** <<<byte[]>>> |
| |
| [] |
| |
| +--------------------------+ |
| UniformRandomProvider rng = RandomSource.create(RandomSource.ISAAC, 5776); |
| +--------------------------+ |
| +--------------------------+ |
| UniformRandomProvider rng = RandomSource.create(RandomSource.ISAAC, new int[] { 6, 7, 7, 5, 6, 1, 0, 2 }); |
| +--------------------------+ |
| +--------------------------+ |
| UniformRandomProvider rng = RandomSource.create(RandomSource.ISAAC, new long[] { 0x638a3fd83bc0e851L, 0x9730fd12c75ae247L }); |
| +--------------------------+ |
| |
| Note however that, upon initialization, the underlying generation algorithm |
| |
| ** may not use all the information contents of the seed, |
| |
| ** may use a procedure (using the given seed as input) for further filling its internal state |
| (in order to avoid a too uniform initial state). |
| |
| [] |
| |
| In both cases, the behaviour is not standard but should not change between releases of the library |
| (bugs notwithstanding). |
| |
| Each RNG implementation has a single "native" seed; when the seed argument passed |
| to the <<<create>>> method is not of the native type, it is automatically converted. |
| The conversion preserves the information contents but is otherwise not specified (i.e. |
| different releases of the library may use different conversion procedures). |
| |
| Hence, if reproducibility of the generated sequences across successive releases of the |
| library is necessary, users should ensure that they use native seeds. |
| |
| +--------------------------+ |
| long seed = 9246234616L; |
| if (!RandomSource.TWO_CMRES.isNativeSeed(seed)) { |
| throw new IllegalArgumentException("Seed is not native"); |
| } |
| +--------------------------+ |
| |
| For each available implementation, the native seed type is specified in the |
| {{{../commons-rng-simple/apidocs/org/apache/commons/rng/simple/RandomSource.html#enum.constant.detail}Javadoc}}. |
| |
| |
| * Whenever a random source implementation is parameterized, the custom arguments |
| are passed after the seed. |
| |
| +--------------------------+ |
| int seed = 96912062; |
| int first = 7; // Subcycle identifier. |
| int second = 4; // Subcycle identifier. |
| UniformRandomProvider rng = RandomSource.create(RandomSource.TWO_CMRES_SELECT, seed, first, second); |
| +--------------------------+ |
| |
| In the above example, valid "subcycle identifiers" are in the interval [0, 13]. |
| |
| |
| * The current state of a generator can be |
| {{{../commons-rng-client-api/apidocs/org/apache/commons/rng/RestorableUniformRandomProvider.html#saveState--}saved}} |
| and |
| {{{../commons-rng-client-api/apidocs/org/apache/commons/rng/RestorableUniformRandomProvider.html#restoreState-org.apache.commons.rng.RandomProviderState-}restored}} |
| later on. |
| |
| +--------------------------+ |
| import org.apache.commons.rng.RestorableUniformRandomProvider; |
| import org.apache.commons.rng.RandomProviderState; |
| |
| RestorableUniformRandomProvider rng = RandomSource.create(RandomSource.WELL_512_A); |
| RandomProviderState state = rng.saveState(); |
| double x = rng.nextDouble(); |
| rng.restoreState(state); |
| double y = rng.nextDouble(); // x == y. |
| +--------------------------+ |
| |
| |
| * The <<<UniformRandomProvider>>> objects returned from the <<<create>>> methods do not |
| implement the <<<java.io.Serializable>>> interface. |
| |
| However, users can easily set up a custom serialization scheme if the random source |
| is known at both ends of the communication channel. |
| This would be useful namely to save the state to persistent storage, and restore it |
| such that the sequence will continue from where it left off. |
| |
| +--------------------------+ |
| import org.apache.commons.rng.RestorableUniformRandomProvider; |
| import org.apache.commons.rng.simple.RandomSource; |
| import org.apache.commons.rng.core.RandomProviderDefaultState; |
| |
| RandomSource source = RandomSource.MT_64; // Known source identifier. |
| |
| RestorableUniformRandomProvider rngOrig = RandomSource.create(source); // Original RNG instance. |
| |
| // Save and serialize state. |
| RandomProviderState stateOrig = rngOrig.saveState(rngOrig); |
| ByteArrayOutputStream bos = new ByteArrayOutputStream(); |
| ObjectOutputStream oos = new ObjectOutputStream(bos); |
| oos.writeObject(((RandomProviderDefaultState) stateOrig).getState()); |
| |
| // Deserialize state. |
| ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); |
| ObjectInputStream ois = new ObjectInputStream(bis); |
| RandomProviderState stateNew = new RandomProviderDefaultState((byte[]) ois.readObject()); |
| |
| RestorableUniformRandomProvider rngNew = RandomSource.create(source); // New RNG instance from the same "source". |
| |
| // Restore original state on the new instance. |
| rngNew.restoreState(stateNew); |
| +--------------------------+ |
| |
| * The <<<JumpableUniformRandomProvider>>> interface allows creation of a copy of the generator and |
| advances the state of the current generator a large number of steps in a single jump. This can |
| be used to create a set of generators that will not overlap in their output sequence for the |
| length of the jump for use in parallel computations. |
| |
| +--------------------------+ |
| import org.apache.commons.rng.UniformRandomProvider; |
| import org.apache.commons.rng.JumpableUniformRandomProvider; |
| import org.apache.commons.rng.simple.RandomSource; |
| |
| RandomSource source = RandomSource.XO_RO_SHI_RO_128_SS; // Known to be jumpable. |
| |
| JumpableUniformRandomProvider master = (JumpableUniformRandomProvider) RandomSource.create(source); |
| |
| // For use in parallel |
| UniformRandomProvider[] rngs = new UniformRandomProvider[10]; |
| for (int i = 0; i < rngs.length; i++) { |
| rngs[i] = master.jump(); |
| } |
| +--------------------------+ |
| |
| In the above example, the source is known to implement the <<<JumpableUniformRandomProvider>>> interface. |
| Not all generators support this functionality. |
| |
| * Generation of {{{./dist_density_approx.html}random deviates}} for various |
| {{{../commons-rng-sampling/apidocs/org/apache/commons/rng/sampling/distribution/package-summary.html}distributions}}. |
| |
| +--------------------------+ |
| import org.apache.commons.rng.sampling.distribution.ContinuousSampler; |
| import org.apache.commons.rng.sampling.distribution.GaussianSampler; |
| import org.apache.commons.rng.sampling.distribution.MarsagliaNormalizedGaussianSampler; |
| |
| ContinuousSampler sampler = GaussianSampler.of(MarsagliaNormalizedGaussianSampler.of(RandomSource.create(RandomSource.MT_64)), |
| 45.6, 2.3); |
| double random = sampler.sample(); |
| +--------------------------+ |
| |
| +--------------------------+ |
| import org.apache.commons.rng.sampling.distribution.DiscreteSampler; |
| import org.apache.commons.rng.sampling.distribution.RejectionInversionZipfSampler; |
| |
| DiscreteSampler sampler = RejectionInversionZipfSampler.of(RandomSource.create(RandomSource.ISAAC), |
| 5, 1.2); |
| int random = sampler.sample(); |
| +--------------------------+ |
| |
| * The <<<SharedStateSampler>>> interface allows creation of a copy of the sampler using a new |
| generator. The samplers share only their immutable state and can be used in parallel computations. |
| |
| +--------------------------+ |
| import org.apache.commons.rng.UniformRandomProvider; |
| import org.apache.commons.rng.sampling.distribution.MarsagliaTsangWangDiscreteSampler; |
| import org.apache.commons.rng.sampling.distribution.SharedStateDiscreteSampler; |
| import org.apache.commons.rng.simple.RandomSource; |
| |
| RandomSource source = RandomSource.PCG_XSH_RR_32; |
| |
| double[] probabilities = {0.1, 0.2, 0.3, 0.4}; |
| SharedStateDiscreteSampler sampler1 = MarsagliaTsangWangDiscreteSampler.Enumerated.of(RandomSource.create(source), |
| probabilities); |
| |
| // For use in parallel |
| SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(RandomSource.create(source)); |
| +--------------------------+ |
| |
| All samplers support the <<<SharedStateSampler>>> interface. |
| |
| * {{{../commons-rng-sampling/apidocs/org/apache/commons/rng/sampling/PermutationSampler.html}Permutation}}, |
| {{{../commons-rng-sampling/apidocs/org/apache/commons/rng/sampling/CollectionSampler.html}sampling from a <<<Collection>>>}} |
| and shuffling utilities. |
| |
| +--------------------------+ |
| import org.apache.commons.rng.sampling.PermutationSampler; |
| |
| PermutationSampler sampler = new PermutationSampler(RandomSource.create(RandomSource.KISS), |
| 6, 3); |
| |
| // 3 elements from a shuffling of the (0, 1, 2, 3, 4, 5) tuplet. |
| int[] random = sampler.sample(); |
| +--------------------------+ |
| |
| +--------------------------+ |
| import java.util.ArrayList; |
| import org.apache.commons.rng.sampling.CollectionSampler; |
| |
| ArrayList<String> list = new ArrayList<String>(); |
| list.add("Apache"); |
| list.add("Commons"); |
| list.add("RNG"); |
| |
| CollectionSampler<String> sampler = new CollectionSampler<String>(RandomSource.create(RandomSource.MWC_256), |
| list, 1); |
| String word = sampler.sample(); |
| +--------------------------+ |
| |
| +--------------------------+ |
| import java.util.Arrays; |
| import java.util.List; |
| import org.apache.commons.rng.UniformRandomProvider; |
| import org.apache.commons.rng.sampling.ListSampler; |
| |
| List<String> list = Arrays.asList("Apache", "Commons", "RNG"); |
| |
| UniformRandomProvider rng = RandomSource.create(RandomSource.PCG_XSH_RS_32); |
| |
| // Get 2 random items |
| int k = 2; |
| List<String> sample = ListSampler.sample(rng, list, k); |
| |
| // Shuffle the list |
| ListSampler.shuffle(rng, list) |
| +--------------------------+ |
| |
| [] |
| |
| |
| 3. Library layout |
| |
| The API for client code consists of classes and interfaces defined in package |
| {{{../commons-rng-client-api/apidocs/org/apache/commons/rng/package-summary.html}org.apache.commons.rng}}. |
| |
| * Interface <<<UniformRandomProvider>>> provides access to a sequence of |
| random values uniformly distributed within some range. |
| |
| * Interfaces <<<RestorableUniformRandomProvider>>> and <<<RandomProviderState>>> |
| provide the "save/restore" API. |
| |
| * Interfaces <<<JumpableUniformRandomProvider>>> and <<<LongJumpableUniformRandomProvider>>> |
| provide the "copy and jump" API for parallel computations. |
| |
| [] |
| |
| |
| The API for instantiating generators is defined in package |
| {{{../commons-rng-simple/apidocs/org/apache/commons/rng/simple/package-summary.html}org.apache.commons.rng.simple}}. |
| |
| * Enum <<<RandomSource>>> determines which algorithm to use for generating the |
| sequence of random values. |
| |
| [] |
| |
| The <<<org.apache.commons.rng.simple.internal>>> package contains classes |
| for supporting initialization (a.k.a. "seeding") of the generators. |
| They must not be used directly in applications, as all the necessary utilities |
| are accessible through methods defined in <<<RandomSource>>>. |
| |
| * <<<ProviderBuilder>>>: contains methods for instantiating the concrete |
| RNG implementations based on the source identifier; it also takes care |
| of calling the appropriate classes for seed type conversion. |
| |
| * <<<SeedFactory>>>: contains factory methods for generating random seeds. |
| |
| * <<<SeedConverter>>>: interface for classes that transform between |
| supported seed types. |
| |
| * Various classes that implement <<<SeedConverter>>> in order to transform |
| from caller's seed to "native" seed. |
| |
| [] |
| |
| |
| The {{{../commons-rng-core/apidocs/org/apache/commons/rng/core/package-summary.html}org.apache.commons.rng.core}} |
| package contains the implementation of the algorithms for the generation of |
| pseudo-random sequences. |
| Applications should not directly import or use classes defined in this package: |
| all generators can be instantiated through the <<<RandomSource>>> factory. |
| |
| * Class <<<RandomProviderDefaultState>>> implements the <<<RandomProviderState>>> |
| interface to enable "save/restore" for all <<<RestorableUniformRandomProvider>>> |
| instances created through the <<<RandomSource>>> factory methods. |
| |
| * <<<BaseProvider>>>: base class for all concrete RNG implementations; |
| it contains higher-level algorithms <<<nextInt(int n)>>> and <<<nextLong(long n)>>> |
| common to all implementations. |
| |
| * <<<org.apache.commons.rng.core.util>>> |
| |
| ** <<<NumberFactory>>>: contains utilities for interpreting and combining |
| the output (<<<int>>> or <<<long>>>) of the underlying source of |
| randomness into the requested output, i.e. one of the Java primitive |
| types supported by <<<UniformRandomProvider>>>. |
| |
| [] |
| |
| * <<<org.apache.commons.rng.core.source32>>> |
| |
| ** <<<RandomIntSource>>>: describes an algorithm that generates randomness in |
| 32-bits chunks (a.k.a Java <<<int>>>). |
| |
| ** <<<IntProvider>>>: base class for concrete classes that implement <<<RandomIntSource>>>. |
| |
| ** Concrete RNG algorithms that are subclasses of <<<IntProvider>>>. |
| |
| [] |
| |
| * <<<org.apache.commons.rng.core.source64>>> |
| |
| ** <<<RandomLongSource>>>: describes an algorithm that generates randomness in |
| 64-bits chunks (a.k.a Java <<<long>>>). |
| |
| ** <<<LongProvider>>>: base class for concrete classes that implement <<<RandomLongSource>>>. |
| |
| ** Concrete RNG algorithms that are subclasses of <<<LongProvider>>>. |
| |
| [] |
| |
| [] |
| |
| |
| 4. Performance |
| |
| This section reports |
| {{{../commons-rng-examples/examples-jmh/apidocs/org/apache/commons/rng/jmh/package-summary.html}performance benchmarks}} of the RNG implementations. |
| |
| All runs were performed on a platform with the following characteristics: |
| |
| * CPU: Intel(R) Xeon(R) CPU E5-1680 v3 @ 3.20GHz |
| |
| * Java version: 1.8.0_222 (build 1.8.0_222-8u222-b10-1ubuntu1~16.04.1-b10) |
| |
| * JVM: OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode) |
| |
| [] |
| |
| Performance was measured using the |
| {{{http://openjdk.java.net/projects/code-tools/jmh/}Java Micro-benchmark Harness (JMH)}}. |
| |
| In these tables: |
| |
| * The first column is the RNG identifier (see {{{../commons-rng-simple/apidocs/org/apache/commons/rng/simple/RandomSource.html}RandomSource}}) |
| |
| * <lower> is <better>. |
| |
| [] |
| |
| |
| * 4.1 Generating primitive values |
| |
| The following table indicates the performance for generating: |
| |
| * a sequence of true/false values (a.k.a. Java type <<<boolean>>>) |
| |
| * a sequence of 64-bit floating point numbers (a.k.a. Java type <<<double>>>) |
| |
| * a sequence of 64-bit integers (a.k.a. Java type <<<long>>>) |
| |
| * a sequence of 32-bit floating point numbers (a.k.a. Java type <<<float>>>) |
| |
| * a sequence of 32-bit integers (a.k.a. Java type <<<int>>>) |
| |
| [] |
| |
| Scores are normalized to the score of <<<RandomSource.JDK>>>. |
| |
| Note that the core implementations use all the bits from the random source. For example a native generator of 32-bit <<<int>>> values requires 1 generation call per 32 <<<boolean>>> values; a native generator of 64-bit <<<long>>> values requires 1 generation call per 2 <<<int>>> values. This implementation is fast for all generators but requires a high quality random source. See the {{{a5._Quality}Quality}} section. |
| |
| *-----------------------*---------*---------*---------*---------*---------* |
| || RNG identifier || <<<boolean>>> || <<<double>>> || <<<long>>> || <<<float>>> || <<<int>>> | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | JDK | 1.00000 | 1.00000 | 1.00000 | 1.00000 | 1.00000 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | WELL_512_A | 1.22756 | 0.64774 | 0.62119 | 0.93622 | 0.77620 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | WELL_1024_A | 1.23448 | 0.64702 | 0.61258 | 0.91802 | 0.70279 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | WELL_19937_A | 1.26780 | 0.95420 | 0.90732 | 1.16158 | 1.11143 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | WELL_19937_C | 1.28621 | 1.05665 | 0.93851 | 1.20811 | 1.12241 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | WELL_44497_A | 1.28290 | 1.04643 | 0.97920 | 1.18315 | 1.13812 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | WELL_44497_B | 1.29803 | 1.08804 | 1.03050 | 1.27588 | 1.19919 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | MT | 1.18727 | 0.49954 | 0.43062 | 0.69037 | 0.58075 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | ISAAC | 0.98206 | 0.54405 | 0.48967 | 0.60378 | 0.50929 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | SPLIT_MIX_64 | 1.14541 | 0.13405 | 0.09897 | 0.28460 | 0.19431 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XOR_SHIFT_1024_S | 1.15061 | 0.18243 | 0.14459 | 0.34174 | 0.25242 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | TWO_CMRES | 1.16284 | 0.18267 | 0.15281 | 0.34984 | 0.28657 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | MT_64 | 1.17461 | 0.27294 | 0.23374 | 0.48280 | 0.35967 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | MWC_256 | 1.15759 | 0.25411 | 0.21631 | 0.36768 | 0.25554 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | KISS | 1.17760 | 0.41165 | 0.41526 | 0.54227 | 0.42641 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XOR_SHIFT_1024_S_PHI | 1.16893 | 0.18236 | 0.14382 | 0.34424 | 0.24821 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_RO_SHI_RO_64_S | 1.16685 | 0.18914 | 0.13536 | 0.24512 | 0.18364 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_RO_SHI_RO_64_SS | 1.15470 | 0.24486 | 0.17811 | 0.29518 | 0.20803 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_SHI_RO_128_PLUS | 1.15176 | 0.26227 | 0.18374 | 0.32524 | 0.25558 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_SHI_RO_128_SS | 1.15975 | 0.32451 | 0.25989 | 0.40865 | 0.28614 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_RO_SHI_RO_128_PLUS | 1.16683 | 0.10546 | 0.08192 | 0.25955 | 0.17326 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_RO_SHI_RO_128_SS | 1.15738 | 0.13400 | 0.10186 | 0.27885 | 0.19879 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_SHI_RO_256_PLUS | 1.14354 | 0.14036 | 0.11078 | 0.29566 | 0.21558 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_SHI_RO_256_SS | 1.14810 | 0.17469 | 0.12788 | 0.32338 | 0.23577 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_SHI_RO_512_PLUS | 1.16148 | 0.25360 | 0.19347 | 0.40327 | 0.34086 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | XO_SHI_RO_512_SS | 1.16359 | 0.27005 | 0.21910 | 0.41828 | 0.35155 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | PCG_XSH_RR_32 | 0.94365 | 0.30150 | 0.26162 | 0.39426 | 0.19832 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | PCG_XSH_RS_32 | 0.94766 | 0.23958 | 0.18884 | 0.29117 | 0.20081 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | PCG_RXS_M_XS_64 | 1.15168 | 0.13238 | 0.11352 | 0.29651 | 0.20707 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | PCG_MCG_XSH_RR_32 | 0.94123 | 0.28870 | 0.28352 | 0.36381 | 0.17816 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | PCG_MCG_XSH_RS_32 | 0.93742 | 0.22574 | 0.17845 | 0.26411 | 0.16822 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | MSWS | 1.12821 | 0.17897 | 0.15428 | 0.23731 | 0.15224 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | SFC_32 | 1.15334 | 0.28210 | 0.19387 | 0.32224 | 0.26020 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | SFC_64 | 1.13927 | 0.14057 | 0.11686 | 0.31031 | 0.23761 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | JSF_32 | 1.14659 | 0.24439 | 0.17106 | 0.29932 | 0.22710 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| | JSF_64 | 1.13970 | 0.13366 | 0.10999 | 0.28153 | 0.21406 | |
| *-----------------------+---------:---------:---------:---------:---------: |
| |
| The <<<RandomSource.JDK>>> generator uses thread-safe (synchronized) <<<int>>> generation which has a performance overhead (see the <<<int>>> generation results). For the <<<boolean>>> generation the synchronization occurs 1 in 32 calls and the resulting performance is good. However the output will be low quality and this generator should not be used. See the {{{a5._Quality}Quality}} section for details. |
| |
| |
| * 4.2 Generating Gaussian samples |
| |
| The following table compares the |
| {{{../commons-rng-sampling/apidocs/org/apache/commons/rng/sampling/distribution/BoxMullerNormalizedGaussianSampler.html}BoxMullerNormalizedGaussianSampler}}, |
| {{{../commons-rng-sampling/apidocs/org/apache/commons/rng/sampling/distribution/MarsagliaNormalizedGaussianSampler.html}MarsagliaNormalizedGaussianSampler}}, |
| and {{{../commons-rng-sampling/apidocs/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSampler.html}ZigguratNormalizedGaussianSampler}}. |
| |
| Each score is normalized to the score of {{{https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextGaussian--}nextGaussian()}} method of <<<java.util.Random>>>. |
| |
| *-----------------------*---------*---------*---------* |
| || RNG identifier || <<<BoxMullerNormalizedGaussianSampler>>> || <<<MarsagliaNormalizedGaussianSampler>>> || <<<ZigguratNormalizedGaussianSampler>>> | |
| *-----------------------+---------:---------:---------: |
| | JDK | 0.77702 | 0.73404 | 0.35962 | |
| *-----------------------+---------:---------:---------: |
| | WELL_512_A | 0.74382 | 0.55948 | 0.29644 | |
| *-----------------------+---------:---------:---------: |
| | WELL_1024_A | 0.76090 | 0.58622 | 0.28907 | |
| *-----------------------+---------:---------:---------: |
| | WELL_19937_A | 0.82990 | 0.69155 | 0.33604 | |
| *-----------------------+---------:---------:---------: |
| | WELL_19937_C | 0.84971 | 0.68691 | 0.36119 | |
| *-----------------------+---------:---------:---------: |
| | WELL_44497_A | 0.87142 | 0.68325 | 0.36127 | |
| *-----------------------+---------:---------:---------: |
| | WELL_44497_B | 0.87542 | 0.72058 | 0.37799 | |
| *-----------------------+---------:---------:---------: |
| | MT | 0.66909 | 0.47290 | 0.25770 | |
| *-----------------------+---------:---------:---------: |
| | ISAAC | 0.68446 | 0.44854 | 0.26808 | |
| *-----------------------+---------:---------:---------: |
| | SPLIT_MIX_64 | 0.57968 | 0.31845 | 0.16815 | |
| *-----------------------+---------:---------:---------: |
| | XOR_SHIFT_1024_S | 0.57622 | 0.32793 | 0.18497 | |
| *-----------------------+---------:---------:---------: |
| | TWO_CMRES | 0.62548 | 0.35266 | 0.20977 | |
| *-----------------------+---------:---------:---------: |
| | MT_64 | 0.62083 | 0.37632 | 0.21736 | |
| *-----------------------+---------:---------:---------: |
| | MWC_256 | 0.58796 | 0.35393 | 0.18765 | |
| *-----------------------+---------:---------:---------: |
| | KISS | 0.65734 | 0.45035 | 0.22921 | |
| *-----------------------+---------:---------:---------: |
| | XOR_SHIFT_1024_S_PHI | 0.57800 | 0.32762 | 0.18537 | |
| *-----------------------+---------:---------:---------: |
| | XO_RO_SHI_RO_64_S | 0.58318 | 0.33575 | 0.17617 | |
| *-----------------------+---------:---------:---------: |
| | XO_RO_SHI_RO_64_SS | 0.59105 | 0.34913 | 0.19439 | |
| *-----------------------+---------:---------:---------: |
| | XO_SHI_RO_128_PLUS | 0.59106 | 0.33631 | 0.17957 | |
| *-----------------------+---------:---------:---------: |
| | XO_SHI_RO_128_SS | 0.61742 | 0.37101 | 0.19600 | |
| *-----------------------+---------:---------:---------: |
| | XO_RO_SHI_RO_128_PLUS | 0.55609 | 0.30674 | 0.14833 | |
| *-----------------------+---------:---------:---------: |
| | XO_RO_SHI_RO_128_SS | 0.55722 | 0.32036 | 0.15569 | |
| *-----------------------+---------:---------:---------: |
| | XO_SHI_RO_256_PLUS | 0.56563 | 0.30972 | 0.15639 | |
| *-----------------------+---------:---------:---------: |
| | XO_SHI_RO_256_SS | 0.57758 | 0.31364 | 0.16399 | |
| *-----------------------+---------:---------:---------: |
| | XO_SHI_RO_512_PLUS | 0.58733 | 0.36153 | 0.18189 | |
| *-----------------------+---------:---------:---------: |
| | XO_SHI_RO_512_SS | 0.58114 | 0.32797 | 0.19000 | |
| *-----------------------+---------:---------:---------: |
| | PCG_XSH_RR_32 | 0.60315 | 0.41543 | 0.22119 | |
| *-----------------------+---------:---------:---------: |
| | PCG_XSH_RS_32 | 0.59535 | 0.35324 | 0.20068 | |
| *-----------------------+---------:---------:---------: |
| | PCG_RXS_M_XS_64 | 0.57059 | 0.32078 | 0.18113 | |
| *-----------------------+---------:---------:---------: |
| | PCG_MCG_XSH_RR_32 | 0.59735 | 0.41154 | 0.21198 | |
| *-----------------------+---------:---------:---------: |
| | PCG_MCG_XSH_RS_32 | 0.58732 | 0.34865 | 0.18043 | |
| *-----------------------+---------:---------:---------: |
| | MSWS | 0.57420 | 0.33353 | 0.17289 | |
| *-----------------------+---------:---------:---------: |
| | SFC_32 | 0.58872 | 0.34649 | 0.18663 | |
| *-----------------------+---------:---------:---------: |
| | SFC_64 | 0.55058 | 0.38304 | 0.15942 | |
| *-----------------------+---------:---------:---------: |
| | JSF_32 | 0.63566 | 0.35527 | 0.17554 | |
| *-----------------------+---------:---------:---------: |
| | JSF_64 | 0.56291 | 0.31014 | 0.15530 | |
| *-----------------------+---------:---------:---------: |
| |
| Note that the reference <<<java.util.Random>>> nextGaussian() method uses the Box-Muller algorithm and a synchronized method call per sample. The <<<RandomSource.JDK>>> RNG will use 1 synchronized method call for two samples when using the <<<BoxMullerNormalizedGaussianSampler>>>, hence the observed difference. All the other RNGs are not synchronized. |
| |
| |
| 5. Quality |
| |
| This section reports results of |
| {{{../commons-rng-examples/apidocs/org/apache/commons/rng/examples/stress/package-summary.html}performing "stress tests"}} |
| that aim at detecting failures of an implementation to produce sequences of numbers |
| that follow a uniform distribution. |
| |
| Two different test suites were used: |
| |
| * {{{http://www.phy.duke.edu/~rgb/General/dieharder.php}Dieharder}} |
| |
| * {{{http://simul.iro.umontreal.ca/testu01/tu01.html}TestU01}} |
| |
| [] |
| |
| Note that the test suites accept 32-bit integer values. The RNG implementations are tested using all the output bits from the generator. Any generator of 64-bit <<<long>>> values has the upper and lower 32-bits passed to the test suite. |
| |
| The first column is the RNG identifier (see {{{../commons-rng-simple/apidocs/org/apache/commons/rng/simple/RandomSource.html}RandomSource}}). |
| The second and third columns contain the number of tests which <Dieharder> and <TestU01> |
| respectively reported as below the accepted threshold for considering the sequence as |
| uniformly random; hence, in this table, <lower> is <better>. |
| |
| For each of the two test suites, five runs were performed (using random seeds): Click on one |
| of the numbers of the comma-separated list in order to see the text report of the |
| corresponding run. |
| Note: For <Dieharder> the "Diehard Sums Test" is {{{http://www.phy.duke.edu/~rgb/General/dieharder.php}ignored}} from the failure counts. |
| |
| |
| *-----------------*------------*----------------------* |
| || RNG identifier || Dieharder || TestU01 (BigCrush) || |
| *-----------------+------------+----------------------+ |
| | JDK | {{{../txt/userguide/stress/dh_1_1}4}}, {{{../txt/userguide/stress/dh_1_2}4}}, {{{../txt/userguide/stress/dh_1_3}4}}, {{{../txt/userguide/stress/dh_1_4}4}}, {{{../txt/userguide/stress/dh_1_5}4}} | {{{../txt/userguide/stress/tu_1_1}74}}, {{{../txt/userguide/stress/tu_1_2}72}}, {{{../txt/userguide/stress/tu_1_3}74}}, {{{../txt/userguide/stress/tu_1_4}73}}, {{{../txt/userguide/stress/tu_1_5}74}} | |
| *-----------------+------------+----------------------+ |
| | WELL_512_A | {{{../txt/userguide/stress/dh_2_1}0}}, {{{../txt/userguide/stress/dh_2_2}0}}, {{{../txt/userguide/stress/dh_2_3}0}}, {{{../txt/userguide/stress/dh_2_4}0}}, {{{../txt/userguide/stress/dh_2_5}0}} | {{{../txt/userguide/stress/tu_2_1}7}}, {{{../txt/userguide/stress/tu_2_2}6}}, {{{../txt/userguide/stress/tu_2_3}6}}, {{{../txt/userguide/stress/tu_2_4}6}}, {{{../txt/userguide/stress/tu_2_5}6}} | |
| *-----------------+------------+----------------------+ |
| | WELL_1024_A | {{{../txt/userguide/stress/dh_3_1}0}}, {{{../txt/userguide/stress/dh_3_2}0}}, {{{../txt/userguide/stress/dh_3_3}0}}, {{{../txt/userguide/stress/dh_3_4}0}}, {{{../txt/userguide/stress/dh_3_5}0}} | {{{../txt/userguide/stress/tu_3_1}4}}, {{{../txt/userguide/stress/tu_3_2}4}}, {{{../txt/userguide/stress/tu_3_3}5}}, {{{../txt/userguide/stress/tu_3_4}4}}, {{{../txt/userguide/stress/tu_3_5}4}} | |
| *-----------------+------------+----------------------+ |
| | WELL_19937_A | {{{../txt/userguide/stress/dh_4_1}0}}, {{{../txt/userguide/stress/dh_4_2}1}}, {{{../txt/userguide/stress/dh_4_3}0}}, {{{../txt/userguide/stress/dh_4_4}0}}, {{{../txt/userguide/stress/dh_4_5}0}} | {{{../txt/userguide/stress/tu_4_1}3}}, {{{../txt/userguide/stress/tu_4_2}3}}, {{{../txt/userguide/stress/tu_4_3}2}}, {{{../txt/userguide/stress/tu_4_4}2}}, {{{../txt/userguide/stress/tu_4_5}2}} | |
| *-----------------+------------+----------------------+ |
| | WELL_19937_C | {{{../txt/userguide/stress/dh_5_1}0}}, {{{../txt/userguide/stress/dh_5_2}0}}, {{{../txt/userguide/stress/dh_5_3}0}}, {{{../txt/userguide/stress/dh_5_4}0}}, {{{../txt/userguide/stress/dh_5_5}0}} | {{{../txt/userguide/stress/tu_5_1}2}}, {{{../txt/userguide/stress/tu_5_2}2}}, {{{../txt/userguide/stress/tu_5_3}3}}, {{{../txt/userguide/stress/tu_5_4}2}}, {{{../txt/userguide/stress/tu_5_5}2}} | |
| *-----------------+------------+----------------------+ |
| | WELL_44497_A | {{{../txt/userguide/stress/dh_6_1}0}}, {{{../txt/userguide/stress/dh_6_2}0}}, {{{../txt/userguide/stress/dh_6_3}0}}, {{{../txt/userguide/stress/dh_6_4}0}}, {{{../txt/userguide/stress/dh_6_5}0}} | {{{../txt/userguide/stress/tu_6_1}2}}, {{{../txt/userguide/stress/tu_6_2}2}}, {{{../txt/userguide/stress/tu_6_3}2}}, {{{../txt/userguide/stress/tu_6_4}2}}, {{{../txt/userguide/stress/tu_6_5}3}} | |
| *-----------------+------------+----------------------+ |
| | WELL_44497_B | {{{../txt/userguide/stress/dh_7_1}0}}, {{{../txt/userguide/stress/dh_7_2}0}}, {{{../txt/userguide/stress/dh_7_3}0}}, {{{../txt/userguide/stress/dh_7_4}0}}, {{{../txt/userguide/stress/dh_7_5}0}} | {{{../txt/userguide/stress/tu_7_1}2}}, {{{../txt/userguide/stress/tu_7_2}3}}, {{{../txt/userguide/stress/tu_7_3}2}}, {{{../txt/userguide/stress/tu_7_4}2}}, {{{../txt/userguide/stress/tu_7_5}2}} | |
| *-----------------+------------+----------------------+ |
| | MT | {{{../txt/userguide/stress/dh_8_1}0}}, {{{../txt/userguide/stress/dh_8_2}0}}, {{{../txt/userguide/stress/dh_8_3}0}}, {{{../txt/userguide/stress/dh_8_4}0}}, {{{../txt/userguide/stress/dh_8_5}0}} | {{{../txt/userguide/stress/tu_8_1}2}}, {{{../txt/userguide/stress/tu_8_2}3}}, {{{../txt/userguide/stress/tu_8_3}2}}, {{{../txt/userguide/stress/tu_8_4}2}}, {{{../txt/userguide/stress/tu_8_5}2}} | |
| *-----------------+------------+----------------------+ |
| | ISAAC | {{{../txt/userguide/stress/dh_9_1}0}}, {{{../txt/userguide/stress/dh_9_2}0}}, {{{../txt/userguide/stress/dh_9_3}0}}, {{{../txt/userguide/stress/dh_9_4}0}}, {{{../txt/userguide/stress/dh_9_5}0}} | {{{../txt/userguide/stress/tu_9_1}0}}, {{{../txt/userguide/stress/tu_9_2}1}}, {{{../txt/userguide/stress/tu_9_3}2}}, {{{../txt/userguide/stress/tu_9_4}0}}, {{{../txt/userguide/stress/tu_9_5}0}} | |
| *-----------------+------------+----------------------+ |
| | SPLIT_MIX_64 | {{{../txt/userguide/stress/dh_10_1}0}}, {{{../txt/userguide/stress/dh_10_2}0}}, {{{../txt/userguide/stress/dh_10_3}0}}, {{{../txt/userguide/stress/dh_10_4}0}}, {{{../txt/userguide/stress/dh_10_5}0}} | {{{../txt/userguide/stress/tu_10_1}1}}, {{{../txt/userguide/stress/tu_10_2}0}}, {{{../txt/userguide/stress/tu_10_3}0}}, {{{../txt/userguide/stress/tu_10_4}0}}, {{{../txt/userguide/stress/tu_10_5}0}} | |
| *-----------------+------------+----------------------+ |
| | XOR_SHIFT_1024_S | {{{../txt/userguide/stress/dh_11_1}0}}, {{{../txt/userguide/stress/dh_11_2}0}}, {{{../txt/userguide/stress/dh_11_3}0}}, {{{../txt/userguide/stress/dh_11_4}0}}, {{{../txt/userguide/stress/dh_11_5}0}} | {{{../txt/userguide/stress/tu_11_1}0}}, {{{../txt/userguide/stress/tu_11_2}0}}, {{{../txt/userguide/stress/tu_11_3}0}}, {{{../txt/userguide/stress/tu_11_4}0}}, {{{../txt/userguide/stress/tu_11_5}0}} | |
| *-----------------+------------+----------------------+ |
| | TWO_CMRES | {{{../txt/userguide/stress/dh_12_1}2}}, {{{../txt/userguide/stress/dh_12_2}2}}, {{{../txt/userguide/stress/dh_12_3}2}}, {{{../txt/userguide/stress/dh_12_4}2}}, {{{../txt/userguide/stress/dh_12_5}2}} | {{{../txt/userguide/stress/tu_12_1}4}}, {{{../txt/userguide/stress/tu_12_2}3}}, {{{../txt/userguide/stress/tu_12_3}3}}, {{{../txt/userguide/stress/tu_12_4}5}}, {{{../txt/userguide/stress/tu_12_5}4}} | |
| *-----------------+------------+----------------------+ |
| | MT_64 | {{{../txt/userguide/stress/dh_14_1}0}}, {{{../txt/userguide/stress/dh_14_2}0}}, {{{../txt/userguide/stress/dh_14_3}0}}, {{{../txt/userguide/stress/dh_14_4}0}}, {{{../txt/userguide/stress/dh_14_5}0}} | {{{../txt/userguide/stress/tu_14_1}2}}, {{{../txt/userguide/stress/tu_14_2}3}}, {{{../txt/userguide/stress/tu_14_3}2}}, {{{../txt/userguide/stress/tu_14_4}2}}, {{{../txt/userguide/stress/tu_14_5}2}} | |
| *-----------------+------------+----------------------+ |
| | MWC_256 | {{{../txt/userguide/stress/dh_15_1}0}}, {{{../txt/userguide/stress/dh_15_2}0}}, {{{../txt/userguide/stress/dh_15_3}0}}, {{{../txt/userguide/stress/dh_15_4}0}}, {{{../txt/userguide/stress/dh_15_5}0}} | {{{../txt/userguide/stress/tu_15_1}0}}, {{{../txt/userguide/stress/tu_15_2}0}}, {{{../txt/userguide/stress/tu_15_3}0}}, {{{../txt/userguide/stress/tu_15_4}2}}, {{{../txt/userguide/stress/tu_15_5}0}} | |
| *-----------------+------------+----------------------+ |
| | KISS | {{{../txt/userguide/stress/dh_16_1}0}}, {{{../txt/userguide/stress/dh_16_2}0}}, {{{../txt/userguide/stress/dh_16_3}0}}, {{{../txt/userguide/stress/dh_16_4}0}}, {{{../txt/userguide/stress/dh_16_5}0}} | {{{../txt/userguide/stress/tu_16_1}0}}, {{{../txt/userguide/stress/tu_16_2}0}}, {{{../txt/userguide/stress/tu_16_3}0}}, {{{../txt/userguide/stress/tu_16_4}0}}, {{{../txt/userguide/stress/tu_16_5}0}} | |
| *-----------------+------------+----------------------+ |
| | XOR_SHIFT_1024_S_PHI | {{{../txt/userguide/stress/dh_17_1}0}}, {{{../txt/userguide/stress/dh_17_2}0}}, {{{../txt/userguide/stress/dh_17_3}0}}, {{{../txt/userguide/stress/dh_17_4}0}}, {{{../txt/userguide/stress/dh_17_5}0}} | {{{../txt/userguide/stress/tu_17_1}0}}, {{{../txt/userguide/stress/tu_17_2}0}}, {{{../txt/userguide/stress/tu_17_3}0}}, {{{../txt/userguide/stress/tu_17_4}0}}, {{{../txt/userguide/stress/tu_17_5}0}} | |
| *-----------------+------------+----------------------+ |
| | XO_RO_SHI_RO_64_S | {{{../txt/userguide/stress/dh_18_1}0}}, {{{../txt/userguide/stress/dh_18_2}0}}, {{{../txt/userguide/stress/dh_18_3}0}}, {{{../txt/userguide/stress/dh_18_4}0}}, {{{../txt/userguide/stress/dh_18_5}0}} | {{{../txt/userguide/stress/tu_18_1}1}}, {{{../txt/userguide/stress/tu_18_2}1}}, {{{../txt/userguide/stress/tu_18_3}2}}, {{{../txt/userguide/stress/tu_18_4}1}}, {{{../txt/userguide/stress/tu_18_5}3}} | |
| *-----------------+------------+----------------------+ |
| | XO_RO_SHI_RO_64_SS | {{{../txt/userguide/stress/dh_19_1}0}}, {{{../txt/userguide/stress/dh_19_2}0}}, {{{../txt/userguide/stress/dh_19_3}0}}, {{{../txt/userguide/stress/dh_19_4}0}}, {{{../txt/userguide/stress/dh_19_5}0}} | {{{../txt/userguide/stress/tu_19_1}0}}, {{{../txt/userguide/stress/tu_19_2}0}}, {{{../txt/userguide/stress/tu_19_3}0}}, {{{../txt/userguide/stress/tu_19_4}0}}, {{{../txt/userguide/stress/tu_19_5}0}} | |
| *-----------------+------------+----------------------+ |
| | XO_SHI_RO_128_PLUS | {{{../txt/userguide/stress/dh_20_1}0}}, {{{../txt/userguide/stress/dh_20_2}0}}, {{{../txt/userguide/stress/dh_20_3}0}}, {{{../txt/userguide/stress/dh_20_4}0}}, {{{../txt/userguide/stress/dh_20_5}0}} | {{{../txt/userguide/stress/tu_20_1}1}}, {{{../txt/userguide/stress/tu_20_2}2}}, {{{../txt/userguide/stress/tu_20_3}2}}, {{{../txt/userguide/stress/tu_20_4}1}}, {{{../txt/userguide/stress/tu_20_5}1}} | |
| *-----------------+------------+----------------------+ |
| | XO_SHI_RO_128_SS | {{{../txt/userguide/stress/dh_21_1}0}}, {{{../txt/userguide/stress/dh_21_2}0}}, {{{../txt/userguide/stress/dh_21_3}0}}, {{{../txt/userguide/stress/dh_21_4}0}}, {{{../txt/userguide/stress/dh_21_5}0}} | {{{../txt/userguide/stress/tu_21_1}0}}, {{{../txt/userguide/stress/tu_21_2}1}}, {{{../txt/userguide/stress/tu_21_3}0}}, {{{../txt/userguide/stress/tu_21_4}0}}, {{{../txt/userguide/stress/tu_21_5}0}} | |
| *-----------------+------------+----------------------+ |
| | XO_RO_SHI_RO_128_PLUS | {{{../txt/userguide/stress/dh_22_1}0}}, {{{../txt/userguide/stress/dh_22_2}0}}, {{{../txt/userguide/stress/dh_22_3}0}}, {{{../txt/userguide/stress/dh_22_4}0}}, {{{../txt/userguide/stress/dh_22_5}0}} | {{{../txt/userguide/stress/tu_22_1}0}}, {{{../txt/userguide/stress/tu_22_2}1}}, {{{../txt/userguide/stress/tu_22_3}0}}, {{{../txt/userguide/stress/tu_22_4}0}}, {{{../txt/userguide/stress/tu_22_5}0}} | |
| *-----------------+------------+----------------------+ |
| | XO_RO_SHI_RO_128_SS | {{{../txt/userguide/stress/dh_23_1}0}}, {{{../txt/userguide/stress/dh_23_2}0}}, {{{../txt/userguide/stress/dh_23_3}0}}, {{{../txt/userguide/stress/dh_23_4}0}}, {{{../txt/userguide/stress/dh_23_5}0}} | {{{../txt/userguide/stress/tu_23_1}1}}, {{{../txt/userguide/stress/tu_23_2}0}}, {{{../txt/userguide/stress/tu_23_3}1}}, {{{../txt/userguide/stress/tu_23_4}0}}, {{{../txt/userguide/stress/tu_23_5}0}} | |
| *-----------------+------------+----------------------+ |
| | XO_SHI_RO_256_PLUS | {{{../txt/userguide/stress/dh_24_1}0}}, {{{../txt/userguide/stress/dh_24_2}0}}, {{{../txt/userguide/stress/dh_24_3}0}}, {{{../txt/userguide/stress/dh_24_4}0}}, {{{../txt/userguide/stress/dh_24_5}0}} | {{{../txt/userguide/stress/tu_24_1}0}}, {{{../txt/userguide/stress/tu_24_2}0}}, {{{../txt/userguide/stress/tu_24_3}0}}, {{{../txt/userguide/stress/tu_24_4}0}}, {{{../txt/userguide/stress/tu_24_5}0}} | |
| *-----------------+------------+----------------------+ |
| | XO_SHI_RO_256_SS | {{{../txt/userguide/stress/dh_25_1}0}}, {{{../txt/userguide/stress/dh_25_2}0}}, {{{../txt/userguide/stress/dh_25_3}0}}, {{{../txt/userguide/stress/dh_25_4}0}}, {{{../txt/userguide/stress/dh_25_5}0}} | {{{../txt/userguide/stress/tu_25_1}0}}, {{{../txt/userguide/stress/tu_25_2}1}}, {{{../txt/userguide/stress/tu_25_3}0}}, {{{../txt/userguide/stress/tu_25_4}2}}, {{{../txt/userguide/stress/tu_25_5}1}} | |
| *-----------------+------------+----------------------+ |
| | XO_SHI_RO_512_PLUS | {{{../txt/userguide/stress/dh_26_1}0}}, {{{../txt/userguide/stress/dh_26_2}0}}, {{{../txt/userguide/stress/dh_26_3}0}}, {{{../txt/userguide/stress/dh_26_4}0}}, {{{../txt/userguide/stress/dh_26_5}0}} | {{{../txt/userguide/stress/tu_26_1}0}}, {{{../txt/userguide/stress/tu_26_2}0}}, {{{../txt/userguide/stress/tu_26_3}0}}, {{{../txt/userguide/stress/tu_26_4}2}}, {{{../txt/userguide/stress/tu_26_5}2}} | |
| *-----------------+------------+----------------------+ |
| | XO_SHI_RO_512_SS | {{{../txt/userguide/stress/dh_27_1}0}}, {{{../txt/userguide/stress/dh_27_2}0}}, {{{../txt/userguide/stress/dh_27_3}0}}, {{{../txt/userguide/stress/dh_27_4}0}}, {{{../txt/userguide/stress/dh_27_5}0}} | {{{../txt/userguide/stress/tu_27_1}0}}, {{{../txt/userguide/stress/tu_27_2}1}}, {{{../txt/userguide/stress/tu_27_3}0}}, {{{../txt/userguide/stress/tu_27_4}1}}, {{{../txt/userguide/stress/tu_27_5}0}} | |
| *-----------------+------------+----------------------+ |
| | PCG_XSH_RR_32 | {{{../txt/userguide/stress/dh_28_1}0}}, {{{../txt/userguide/stress/dh_28_2}0}}, {{{../txt/userguide/stress/dh_28_3}0}}, {{{../txt/userguide/stress/dh_28_4}0}}, {{{../txt/userguide/stress/dh_28_5}0}} | {{{../txt/userguide/stress/tu_28_1}0}}, {{{../txt/userguide/stress/tu_28_2}0}}, {{{../txt/userguide/stress/tu_28_3}0}}, {{{../txt/userguide/stress/tu_28_4}0}}, {{{../txt/userguide/stress/tu_28_5}0}} | |
| *-----------------+------------+----------------------+ |
| | PCG_XSH_RS_32 | {{{../txt/userguide/stress/dh_29_1}0}}, {{{../txt/userguide/stress/dh_29_2}0}}, {{{../txt/userguide/stress/dh_29_3}0}}, {{{../txt/userguide/stress/dh_29_4}0}}, {{{../txt/userguide/stress/dh_29_5}0}} | {{{../txt/userguide/stress/tu_29_1}1}}, {{{../txt/userguide/stress/tu_29_2}0}}, {{{../txt/userguide/stress/tu_29_3}1}}, {{{../txt/userguide/stress/tu_29_4}1}}, {{{../txt/userguide/stress/tu_29_5}0}} | |
| *-----------------+------------+----------------------+ |
| | PCG_RXS_M_XS_64 | {{{../txt/userguide/stress/dh_30_1}0}}, {{{../txt/userguide/stress/dh_30_2}0}}, {{{../txt/userguide/stress/dh_30_3}0}}, {{{../txt/userguide/stress/dh_30_4}0}}, {{{../txt/userguide/stress/dh_30_5}0}} | {{{../txt/userguide/stress/tu_30_1}0}}, {{{../txt/userguide/stress/tu_30_2}0}}, {{{../txt/userguide/stress/tu_30_3}1}}, {{{../txt/userguide/stress/tu_30_4}0}}, {{{../txt/userguide/stress/tu_30_5}0}} | |
| *-----------------+------------+----------------------+ |
| | PCG_MCG_XSH_RR_32 | {{{../txt/userguide/stress/dh_31_1}0}}, {{{../txt/userguide/stress/dh_31_2}0}}, {{{../txt/userguide/stress/dh_31_3}0}}, {{{../txt/userguide/stress/dh_31_4}0}}, {{{../txt/userguide/stress/dh_31_5}0}} | {{{../txt/userguide/stress/tu_31_1}0}}, {{{../txt/userguide/stress/tu_31_2}0}}, {{{../txt/userguide/stress/tu_31_3}0}}, {{{../txt/userguide/stress/tu_31_4}0}}, {{{../txt/userguide/stress/tu_31_5}0}} | |
| *-----------------+------------+----------------------+ |
| | PCG_MCG_XSH_RS_32 | {{{../txt/userguide/stress/dh_32_1}0}}, {{{../txt/userguide/stress/dh_32_2}0}}, {{{../txt/userguide/stress/dh_32_3}0}}, {{{../txt/userguide/stress/dh_32_4}0}}, {{{../txt/userguide/stress/dh_32_5}0}} | {{{../txt/userguide/stress/tu_32_1}1}}, {{{../txt/userguide/stress/tu_32_2}1}}, {{{../txt/userguide/stress/tu_32_3}0}}, {{{../txt/userguide/stress/tu_32_4}0}}, {{{../txt/userguide/stress/tu_32_5}0}} | |
| *-----------------+------------+----------------------+ |
| | MSWS | {{{../txt/userguide/stress/dh_33_1}0}}, {{{../txt/userguide/stress/dh_33_2}0}}, {{{../txt/userguide/stress/dh_33_3}0}}, {{{../txt/userguide/stress/dh_33_4}0}}, {{{../txt/userguide/stress/dh_33_5}0}} | {{{../txt/userguide/stress/tu_33_1}0}}, {{{../txt/userguide/stress/tu_33_2}0}}, {{{../txt/userguide/stress/tu_33_3}0}}, {{{../txt/userguide/stress/tu_33_4}1}}, {{{../txt/userguide/stress/tu_33_5}0}} | |
| *-----------------+------------+----------------------+ |
| | SFC_32 | {{{../txt/userguide/stress/dh_34_1}0}}, {{{../txt/userguide/stress/dh_34_2}0}}, {{{../txt/userguide/stress/dh_34_3}0}}, {{{../txt/userguide/stress/dh_34_4}0}}, {{{../txt/userguide/stress/dh_34_5}0}} | {{{../txt/userguide/stress/tu_34_1}0}}, {{{../txt/userguide/stress/tu_34_2}1}}, {{{../txt/userguide/stress/tu_34_3}0}}, {{{../txt/userguide/stress/tu_34_4}0}}, {{{../txt/userguide/stress/tu_34_5}2}} | |
| *-----------------+------------+----------------------+ |
| | SFC_64 | {{{../txt/userguide/stress/dh_35_1}0}}, {{{../txt/userguide/stress/dh_35_2}0}}, {{{../txt/userguide/stress/dh_35_3}0}}, {{{../txt/userguide/stress/dh_35_4}0}}, {{{../txt/userguide/stress/dh_35_5}0}} | {{{../txt/userguide/stress/tu_35_1}0}}, {{{../txt/userguide/stress/tu_35_2}1}}, {{{../txt/userguide/stress/tu_35_3}0}}, {{{../txt/userguide/stress/tu_35_4}0}}, {{{../txt/userguide/stress/tu_35_5}1}} | |
| *-----------------+------------+----------------------+ |
| | JSF_32 | {{{../txt/userguide/stress/dh_36_1}0}}, {{{../txt/userguide/stress/dh_36_2}0}}, {{{../txt/userguide/stress/dh_36_3}0}}, {{{../txt/userguide/stress/dh_36_4}0}}, {{{../txt/userguide/stress/dh_36_5}0}} | {{{../txt/userguide/stress/tu_36_1}0}}, {{{../txt/userguide/stress/tu_36_2}0}}, {{{../txt/userguide/stress/tu_36_3}0}}, {{{../txt/userguide/stress/tu_36_4}1}}, {{{../txt/userguide/stress/tu_36_5}1}} | |
| *-----------------+------------+----------------------+ |
| | JSF_64 | {{{../txt/userguide/stress/dh_37_1}0}}, {{{../txt/userguide/stress/dh_37_2}0}}, {{{../txt/userguide/stress/dh_37_3}0}}, {{{../txt/userguide/stress/dh_37_4}0}}, {{{../txt/userguide/stress/dh_37_5}0}} | {{{../txt/userguide/stress/tu_37_1}1}}, {{{../txt/userguide/stress/tu_37_2}1}}, {{{../txt/userguide/stress/tu_37_3}0}}, {{{../txt/userguide/stress/tu_37_4}0}}, {{{../txt/userguide/stress/tu_37_5}0}} | |
| *-----------------+------------+----------------------+ |
| |
| 6. Dependencies |
| |
| Apache Commons RNG requires JDK 1.6+ and has no runtime dependencies. |