The Middle Square Weyl Sequence (MSWS) generator uses an internal Weyl sequence 
[1] to create randomness. This is basically a linear increment added to a sum 
that will eventually wrap (due to overflow) to restart at the beginning. The 
MSWS paper recommends an increment with a high number of different bits set in 
a random pattern across the 64-bit of the long. The paper recommends using a 
permutation of 8 from the 16 hex digits for the upper and lower 32-bits.

The source code for the MSWS provides a routine that generates a permutation. 
Unfortunately:

- The code is GPL 3 so restricting it from use under the Apache licence 
(without jumping through some hoops)
- The algorithm is a simple rejection method that suffers from high rejection 
probability when approaching 8 digits already chosen

I have created an alternative faster implementation for use when seeding the 
MSWS generator. However it may be a function to be reused in other places.

The question is where to put this utility function. It requires a source of 
randomness to create the permutation. It has the following signature:

/**
 * Creates an {@code int} containing a permutation of 8 hex digits chosen from 
16.
 *
 * @param rng Source of randomness.
 * @return Hex digit permutation.
 */
public static int createIntHexPermutation(UniformRandomProvider rng);

Likewise:

/**
 * Creates a {@code long} containing a permutation of 8 hex digits chosen from 
16 in
 * the upper and lower 32-bits.
 *
 * @param rng Source of randomness.
 * @return Hex digit permutation.
 */
public static long createLongHexPermutation(UniformRandomProvider rng);

Options:

- Put it as a package private function inside the MSWS generator to be used 
only when creating this generator. Package private allows unit testing the 
algorithm does provides the random permutation 16-choose-8
- Put it as a helper function in org.apache.commons.rng.core.util

Note that the function is an alternative to that used by the SplittableRandom 
to create an increment for its own Weyl sequence. That uses a fast method that 
is prone to weak randomness in potential output.

If other methods will potentially be added to the helper class a more generic 
name should be used. Possibilities are:

PermutationUtils
SequenceUtils
IncrementUtils
SeedUtils

Given that the method is for seeding Weyl sequences then I am favouring 
SeedUtils.


[1] https://en.wikipedia.org/wiki/Weyl_sequence 
<https://en.wikipedia.org/wiki/Weyl_sequence>

Reply via email to