Commit ee7502ac authored by Sergio Gelato's avatar Sergio Gelato Committed by Quanah Gibson-Mount
Browse files

ITS#8204 Remove bias towards the first record in RFC2782 shuffle implementation.

Prior to this change, given two records of weight 1 the algorithm would
return them in the order (0,1) with 100% probability instead of the
desired 50%. This was due to an off-by-one error in the range test.

srv_rand() returns a float in the range [0.0, 1.0[, so r is an integer in the
range [0, total[. The correct probability for record 0 to be chosen is
a[0].weight/total, not (a[0].weight+1)/total.
parent 79960723
......@@ -234,7 +234,7 @@ static void srv_shuffle(srv_record *a, int n) {
r = srv_rand() * total;
for (j=0; j<p; j++) {
r -= a[j].weight;
if (r <= 0) {
if (r < 0) {
if (j) {
srv_record t = a[0];
a[0] = a[j];
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment