Fixed crash from FLIP when a numeric variable is specified on NEWNAMES
[pspp] / src / random.c
index ab78b32bb256f19c121c2de34a43529cdb9684d9..cae3f9e70a3fb9f0f05411bfa3114509d9fd768c 100644 (file)
@@ -46,11 +46,17 @@ struct rng *
 rng_create (void) 
 {
   struct rng *rng;
-  static time_t t;
+  static time_t t=0;
 
   rng = xmalloc (sizeof *rng);
-  if (t == 0)
-    time (&t);
+  if (t == 0 || set_seed_used)
+  {
+    if (set_seed == NOT_LONG) 
+      time (&t);
+    else
+      t = set_seed;
+    set_seed_used=0;
+  }
   else
     t++;
   rng_seed (rng, &t, sizeof t);
@@ -154,10 +160,16 @@ rng_get_unsigned (struct rng *rng)
 double
 rng_get_double (struct rng *rng) 
 {
-  unsigned long value;
-
-  rng_get_bytes (rng, &value, sizeof value);
-  return value / ULONG_MAX;
+  for (;;) 
+    {
+      unsigned long ulng;
+      double dbl;
+  
+      rng_get_bytes (rng, &ulng, sizeof ulng);
+      dbl = ulng / (ULONG_MAX + 1.0);
+      if (dbl >= 0 && dbl < 1)
+        return dbl;
+    }
 }
 
 /* Returns a random number from the distribution with mean 0 and