added support for improved pseudo-random number generator
authorHolger Schemel <info@artsoft.org>
Wed, 5 Jan 2022 17:00:50 +0000 (18:00 +0100)
committerHolger Schemel <info@artsoft.org>
Wed, 5 Jan 2022 17:00:50 +0000 (18:00 +0100)
src/libgame/misc.c
src/libgame/misc.h

index faf6c011f25a873980f7b42c1c0a0c24a3a858af..48d67a792dd5b7ea435f5217c0ad1a83b6e1f257 100644 (file)
@@ -746,7 +746,7 @@ void SkipUntilDelayReached(unsigned int *counter_var, unsigned int delay,
 // random generator functions
 // ----------------------------------------------------------------------------
 
-unsigned int init_random_number(int nr, int seed)
+static unsigned int init_random_number_ext(int nr, int seed)
 {
   if (seed == NEW_RANDOMIZE)
   {
@@ -774,9 +774,32 @@ unsigned int init_random_number(int nr, int seed)
   return (unsigned int) seed;
 }
 
+static unsigned int prng_seed_gettimeofday(void)
+{
+  struct timeval current_time;
+
+  gettimeofday(&current_time, NULL);
+
+  prng_seed_bytes(&current_time, sizeof(current_time));
+
+  return 0;
+}
+
+unsigned int init_random_number(int nr, int seed)
+{
+  return (nr == RANDOM_BETTER ? prng_seed_gettimeofday() :
+         init_random_number_ext(nr, seed));
+}
+
+static unsigned int get_random_number_ext(int nr)
+{
+  return (nr == RANDOM_BETTER ? prng_get_uint() :
+         random_linux_libc(nr));
+}
+
 unsigned int get_random_number(int nr, int max)
 {
-  return (max > 0 ? random_linux_libc(nr) % max : 0);
+  return (max > 0 ? get_random_number_ext(nr) % max : 0);
 }
 
 
index 27ae0f3df394bdacd632f9195c430295f7b4545d..19ac4be4deb0ecd8eb5db1c7ee9fa92a77b5f284 100644 (file)
 
 #define RANDOM_ENGINE                  0
 #define RANDOM_SIMPLE                  1
+#define RANDOM_BETTER                  2
 
 #define InitEngineRandom(seed)         init_random_number(RANDOM_ENGINE, seed)
 #define InitSimpleRandom(seed)         init_random_number(RANDOM_SIMPLE, seed)
+#define InitBetterRandom(seed)         init_random_number(RANDOM_BETTER, seed)
 #define GetEngineRandom(max)           get_random_number(RANDOM_ENGINE, max)
 #define GetSimpleRandom(max)           get_random_number(RANDOM_SIMPLE, max)
+#define GetBetterRandom(max)           get_random_number(RANDOM_BETTER, max)
 
 // values for getFile...() and putFile...()
 #define BYTE_ORDER_BIG_ENDIAN          0
@@ -120,6 +123,7 @@ int log_2(unsigned int);
 
 boolean getTokenValueFromString(char *, char **, char **);
 
+char *getUUIDExt(unsigned int (*function)(int));
 char *getUUID(void);
 
 void InitCounter(void);