From e5e538fb7a9cb6a42dae6aa1ad9f36a3dc769ad9 Mon Sep 17 00:00:00 2001 From: Paul Smith <psmith@gnu.org> Date: Sat, 15 Oct 2022 18:11:21 -0400 Subject: [PATCH] [SV 63215] Remember the random seed for shuffle mode Basic fix provided by James Hilliard <james.hilliard1@gmail.com>. Ensure we remember and propagate the random seed we generate during shuffle mode. Also add a debug statement displaying the seed. * src/shuffle.c (shuffle_set_mode): Init and save the randoms seed. * src/misc.c (make_rand): Code cleanups. * src/main.c (main): Show a debug message containing the seed. --- src/main.c | 3 +++ src/misc.c | 9 ++++----- src/shuffle.c | 4 +++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index 05b11c63..d9068ae0 100644 --- a/src/main.c +++ b/src/main.c @@ -2318,6 +2318,9 @@ main (int argc, char **argv, char **envp) OUTPUT_UNSET (); output_close (&make_sync); + if (shuffle_mode) + DB (DB_BASIC, (_("Enabled shuffle mode: %s\n"), shuffle_mode)); + if (read_files) { /* Update any makefiles if necessary. */ diff --git a/src/misc.c b/src/misc.c index 011e4f22..264eeb6a 100644 --- a/src/misc.c +++ b/src/misc.c @@ -75,23 +75,22 @@ make_ulltoa (unsigned long long val, char *buf) /* Simple random number generator, for use with shuffle. This doesn't need to be truly random, just pretty random. Use our own implementation rather than relying on the C runtime's rand() so we always - get the same results for a given seed, regardless of OS. */ + get the same results for a given seed, regardless of C runtime. */ static unsigned int mk_state = 0; void -make_seed(unsigned int seed) +make_seed (unsigned int seed) { mk_state = seed; } unsigned int -make_rand() +make_rand () { /* mk_state must never be 0. */ - if (mk_state == 0) { + if (mk_state == 0) mk_state = (unsigned int)(time (NULL) ^ make_pid ()) + 1; - } /* A simple xorshift RNG. */ mk_state ^= mk_state << 13; diff --git a/src/shuffle.c b/src/shuffle.c index 4cfdc943..17731e8f 100644 --- a/src/shuffle.c +++ b/src/shuffle.c @@ -82,7 +82,9 @@ shuffle_set_mode (const char *cmdarg) } else { - if (strcasecmp (cmdarg, "random") != 0) + if (strcasecmp (cmdarg, "random") == 0) + config.seed = make_rand (); + else { /* Assume explicit seed. */ const char *err;