Improve shuffling algorithm of connection list #634
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I propose implementing the Fisher-Yates shuffle algorithm to improve the shuffling of the connection target list.
You can run this simple simulation to intuitively understand how much bias is produced by the current method and how much the Fisher-Yates shuffle algorithm improves it.
Issue:
In the current shuffle algorithm, each element
l->array[i]
is swapped with a random element at indexj
in the entire array.However, this method does not produce all permutations uniformly, resulting in a bias where some permutations occur more frequently than others.
Solution:
To ensure all permutations are generated with equal probability, I implemented the Fisher-Yates shuffle algorithm.
Intuitive Explanation of Uniformity:
In this algorithm, we start from the end of the array and move towards the beginning.
At each step
i
, we randomly select an indexj
between0
andi
(inclusive) and swapl->array[i]
withl->array[j]
. This means we're randomly choosing an element from the unshuffled portion and placing it at positioni
.Since there's only one way to obtain each permutation through these swaps, all permutations occur with equal probability in theory.
Proof of Uniformity:
At each iteration$\frac{1}{i + 1}$ .
i
, there are exactlyi + 1
choices forj
, so the probability of selecting any particularj
isSince the choices at each iteration are independent, the total probability of any specific permutation is:
Therefore, it is concluded that each permutation occurs with equal probability.
Thank you for your contribution
You are welcome to open PR, but they are used for discussion only. All
patches must eventually go to the openvpn-devel mailing list for review:
Please send your patch using git-send-email. For example to send your latest commit to the list:
For details, see these Wiki articles: