From 310bcec4dcfaeaf4afa40a5b03e588fd224aeda3 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 9 Jul 2017 00:39:15 +0200 Subject: [PATCH] shuf: fix random line selection. Closes 9971 """ For example, given input file: foo bar baz after shuffling the input file, foo will never end up back on the first line. This came to light when I ran into a use-case where someone was selecting a random line from a file using shuf | head -n 1, and the results on busybox were showing a statistical anomaly (as in, the first line would never ever be picked) vs the same process running on environments that had gnu coreutils installed. On line https://git.busybox.net/busybox/tree/coreutils/shuf.c#n56 it uses r %= i, which will result in 0 <= r < i, while the algorithm specifies 0 <= r <= i. """ Signed-off-by: Denys Vlasenko --- coreutils/shuf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreutils/shuf.c b/coreutils/shuf.c index 9f61f2f7d..217f15c97 100644 --- a/coreutils/shuf.c +++ b/coreutils/shuf.c @@ -53,7 +53,7 @@ static void shuffle_lines(char **lines, unsigned numlines) /* RAND_MAX can be as small as 32767 */ if (i > RAND_MAX) r ^= rand() << 15; - r %= i; + r %= i + 1; tmp = lines[i]; lines[i] = lines[r]; lines[r] = tmp;