(rng_get_double) Fix always-returning-zero bug in my preferred way,
authorBen Pfaff <blp@gnu.org>
Tue, 3 Feb 2004 07:47:46 +0000 (07:47 +0000)
committerBen Pfaff <blp@gnu.org>
Tue, 3 Feb 2004 07:47:46 +0000 (07:47 +0000)
and at the same time make sure rounding doesn't bite us.

src/ChangeLog
src/random.c

index aa5395836685525cf3ff37d99993800cae19a4f1..61713e2a8bfb46c4fbf930f4e6f79916cc360bbf 100644 (file)
@@ -1,3 +1,9 @@
+Mon Jan 19 14:08:09 2004  Ben Pfaff  <blp@gnu.org> 
+
+       * random.c (rng_get_double): Fix always-returning-zero bug in my
+       preferred way, and at the same time make sure rounding doesn't
+       bite us.
+
 Thu Jan  1 23:16:41 2004  Ben Pfaff  <blp@gnu.org>
 
        * html.c: (change_attributes) Dead code, removed.
index 163986cc959e319df0b32a26c16fe78b2f6a44b8..20a70fae6ee3cb8f1303fa04b00a02f0a8709aaf 100644 (file)
@@ -159,10 +159,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 / (double) 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