From f0fd0413e2904e0824707d866a044341184bbe13 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Mon, 5 May 2014 21:22:12 +0200 Subject: gib_list_randomize: use code better suited for short lists (closes #151) Note that the i == r check was never reached in the original code but may be in the new variant. Since a shuffled list may well have one or two elements retain their absolute position once in a while, this should not be a problem. tests with 2- and 3-element lists show an even distribution amongst all elements. --- ChangeLog | 1 + src/gib_list.c | 10 ++++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 375a80b..0a441c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ git HEAD three projects (one of which is feh). There is at least one known bug in it, and as I do not have the time to take over giblib development, importing the library seems to be the best solution. + * Fix/improve --randomize for short filelists (closes #151) Sun, 27 Apr 2014 20:28:02 +0200 Daniel Friesel diff --git a/src/gib_list.c b/src/gib_list.c index 1c313ba..a05fb4c 100644 --- a/src/gib_list.c +++ b/src/gib_list.c @@ -362,12 +362,10 @@ gib_list_randomize(gib_list * list) srand(getpid() * time(NULL) % ((unsigned int) -1)); for (i = 0; i < len - 1; i++) { - r = (int) ((len - i - 1) * ((float) rand()) / (RAND_MAX + 1.0)) + i + 1; - if (i == r) - abort(); - t = farray[i]; - farray[i] = farray[r]; - farray[r] = t; + r = i + rand() / (RAND_MAX / (len - i) + 1 ); + t = farray[r]; + farray[r] = farray[i]; + farray[i] = t; } list = farray[0]; list->prev = NULL; -- cgit v1.2.3