Once again, take srand()/random() out of the initialization chain.
authorEric S. Raymond <esr@thyrsus.com>
Thu, 25 May 2017 03:36:25 +0000 (23:36 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Thu, 23 Mar 2023 15:28:53 +0000 (11:28 -0400)
They have exactly the wrong kind of randomness for this job - not
returning consistent sequences across different platforms or C library
versions, and because pseodorandom not really better than sampling
the clock.

main.c
misc.c
misc.h

diff --git a/main.c b/main.c
index a3051ab9dd5e74cc69e3239e47ce11b27b33c456..616a57fcb8814dfc2cbc8314f8e470d2da39b6a2 100644 (file)
--- a/main.c
+++ b/main.c
@@ -99,7 +99,7 @@ int main(int argc, char *argv[]) {
        lcgstate.a = 1093;
        lcgstate.c = 221587;
        lcgstate.m = 1048576;
-       set_seed_from_time();
+       set_seed((long)time(NULL));
 
 /*  Read the database if we have not yet done so */
 
diff --git a/misc.c b/misc.c
index 04107c7d7e41917d617b3d7b7adbd864fa758c9f..3243f1e50895c886efd30e25d329caa4f3e3d776 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -722,7 +722,8 @@ L2: ATDWRF=I;
 
 
 
-/*  Utility routines (SETBIT, TSTBIT, set_seed_from_time, get_next_lcg_value, randrange, RNDVOC, BUG) */
+/*  Utility routines (SETBIT, TSTBIT, set_seed, get_next_lcg_value,
+ *  randrange, RNDVOC, BUG) */
 
 #undef SETBIT
 long fSETBIT(long BIT) {
@@ -758,11 +759,9 @@ long TSTBIT;
 #define TSTBIT(MASK,BIT) fTSTBIT(MASK,BIT)
 #undef RNDVOC
 
-void set_seed_from_time(void)
+void set_seed(long seedval)
 {
-  /* Use the current system time to get seed the ISO rand() function, from which we get a seed for the LCG. */
-  srand(time(NULL));
-  lcgstate.x = (unsigned long) rand() % lcgstate.m;
+  lcgstate.x = (unsigned long) seedval % lcgstate.m;
 }
 
 unsigned long get_next_lcg_value(void)
diff --git a/misc.h b/misc.h
index 869c6728580006ac388c83a20122e21b7a76f8df..67f1e9b0b72923e0e0d61bcb73bcce1c8eddfb72 100644 (file)
--- a/misc.h
+++ b/misc.h
@@ -72,6 +72,6 @@ extern long fIABS(long);
 #define IABS(N) fIABS(N)
 extern long fMOD(long,long);
 #define MOD(N,M) fMOD(N,M)
-extern void set_seed_from_time(void);
+extern void set_seed(long);
 extern unsigned long get_next_lcg_value(void);
 extern long randrange(long);