Alex D Herbert created RNG-61:
---------------------------------
Summary: PermutationSampler shuffle contains unnecessary
conditional
Key: RNG-61
URL: https://issues.apache.org/jira/browse/RNG-61
Project: Commons RNG
Issue Type: Improvement
Components: sampling
Affects Versions: 1.2
Reporter: Alex D Herbert
The Fisher-Yates algorithm in the PermutationSampler has a conditional {{if}}
statement within the loop that checks if the step is the first in the loop. It
then swaps a position with itself. For example for the towards head variant:
{code:java}
for (int i = 0; i <= start; i++) {
final int target;
// Check for start
if (i == start) {
target = start; // this means target == i
} else {
target = rng.nextInt(start - i + 1) + i;
}
// if target == i then this step is not needed.
final int temp = list[target];
list[target] = list[i];
list[i] = temp;
}
{code}
This can be removed by altering the iteration loop:
{code:java}
for (int i = start; i > 0; i--) {
final int target = rng.nextInt(i + 1);
final int temp = list[target];
list[target] = list[i];
list[i] = temp;
}
{code}
An equivalent fix is available for the shuffle towards the tail.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)