shuf: add a TODO, code shrink
function old new delta shuf_main 501 500 -1 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
574b9c446d
commit
6a9b3f7acf
@ -44,21 +44,25 @@
|
||||
*/
|
||||
static void shuffle_lines(char **lines, unsigned numlines, unsigned outlines)
|
||||
{
|
||||
unsigned i;
|
||||
unsigned r;
|
||||
char *tmp;
|
||||
|
||||
srand(monotonic_us());
|
||||
|
||||
for (i = numlines - 1; outlines > 0; i--, outlines--) {
|
||||
r = rand();
|
||||
while (outlines != 0) {
|
||||
char *tmp;
|
||||
unsigned r = rand();
|
||||
/* RAND_MAX can be as small as 32767 */
|
||||
if (i > RAND_MAX)
|
||||
if (numlines > RAND_MAX)
|
||||
r ^= rand() << 15;
|
||||
r %= i + 1;
|
||||
tmp = lines[i];
|
||||
lines[i] = lines[r];
|
||||
r %= numlines;
|
||||
//TODO: the above method is seriously non-uniform when numlines is very large.
|
||||
//For example, with numlines of 0xf0000000,
|
||||
//values of (r % numlines) in [0, 0x0fffffff] range
|
||||
//are more likely: e.g. r=1 and r=0xf0000001 both map to 1,
|
||||
//whereas only one value, r=0xefffffff, maps to 0xefffffff.
|
||||
numlines--;
|
||||
tmp = lines[numlines];
|
||||
lines[numlines] = lines[r];
|
||||
lines[r] = tmp;
|
||||
outlines--;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user