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)

Reply via email to