[
https://issues.apache.org/jira/browse/RNG-174?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Alex Herbert resolved RNG-174.
------------------------------
Resolution: Implemented
Updated in commit:
ab6050d992dd9e8057e0d3e3e29d534839c51440
> Improve support for non-zero seeds
> ----------------------------------
>
> Key: RNG-174
> URL: https://issues.apache.org/jira/browse/RNG-174
> Project: Commons RNG
> Issue Type: Improvement
> Components: simple
> Affects Versions: 1.4
> Reporter: Alex Herbert
> Assignee: Alex Herbert
> Priority: Minor
> Fix For: 1.5
>
>
> The default seed arrays created by RandomSource are ensured to be non-zero in
> the first position. This is to support xor-based generators which are
> non-functional when seeded with all zeros.
> All xor-based generators in the library fill their state from position 0 in
> the input seed array. So this has worked for all current implementations.
> The new LXM family of generators have a composite seed of the state of a
> linear congruential generator (LCG) and the state of a xor-based generator
> (XBG). Ideal seeding for these generators places the LCG state first. This is
> due to the behaviour of the LXM family where the seeding of the LCG can
> create independent streams of RNG output, specifically when using a different
> LCG add parameter (which must be odd). Thus seeding with values 1, 3, 5, 7,
> which are then expanded into a full array, will create non-overlapping RNG
> sequences.
> The requirement to place the LCG state first in the seed shifts the seed for
> the XBG state. It is possible that a generated seed would be all zero in the
> XBG state. The current seed generator is 16-equidistributed and can thus
> output consecutive zeros. The RandomSource seeding behaviour should be
> updated with the option to create a seed which is non-zero in a specified
> range of the seed array.
> The public API in RandomSource is:
> {code:java}
> byte[] createSeed();
> byte[] createSeed(UniformRandomProvider rng);
> static int[] createIntArray(int n);
> static long[] createLongArray(int n);{code}
> The createSeed methods are specific to each RandomSource instance. This is
> delegated to an internal package which creates a native seed of the correct
> length and converts it to bytes. No changes to the public API should be
> required to support non-zero seeds in a range.
> Note that the seed generation method is also used by:
> {code:java}
> RestorableUniformRandomProvider create(); {code}
> So any LXM generator created by the RandomSource enum with no explicit seed
> will also obtain this functionality.
> For the array generation methods, these have no documentation on the non-zero
> behaviour. Either these methods can be left alone, or updated to add a range:
> {code:java}
> int[] RandomSource.createIntArray(int n, int from, int to);
> long[] RandomSource.createLongArray(int n, int from, int to);
> {code}
> In the interest of simplicity, and given that createSeed() is the preferred
> method for a known RandomSource, additional overloads of these methods can be
> omitted.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)