]> mj.ucw.cz Git - libucw.git/blobdiff - lib/random.c
Unfortunately, libraries with public API need an extra rule for their .pc.
[libucw.git] / lib / random.c
index e4ffecdca90d87b8693142a6e8dab9c0b4002406..a771c97ae624a2dd83bda57c95c062e316b77108 100644 (file)
@@ -1,7 +1,7 @@
 /*
- *     Sherlock Library -- Unbiased Range Correction for random()
+ *     UCW Library -- Unbiased Random Numbers
  *
- *     (c) 1998 Martin Mares <mj@ucw.cz>
+ *     (c) 1998--2006 Martin Mares <mj@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
 
 #include <stdlib.h>
 
+/* We expect the random generator in libc to give at least 30 bits of randomness */
+COMPILE_ASSERT(RAND_MAX_RANGE_TEST, RAND_MAX >= (1 << 30)-1);
+
+uns
+random_u32(void)
+{
+  return (random() & 0xffff) | ((random() & 0xffff) << 16);
+}
+
 uns
 random_max(uns max)
 {
   uns r, l;
 
+  ASSERT(max <= (1 << 30));
   l = (RAND_MAX + 1U) - ((RAND_MAX + 1U) % max);
   do
     r = random();
   while (r >= l);
   return r % max;
 }
+
+u64
+random_u64(void)
+{
+  return
+    ((u64)(random() & 0xffff) << 48) |
+    ((u64)(random() & 0xffffff) << 24) |
+    (random() & 0xffffff);
+}
+
+u64
+random_max_u64(u64 max)
+{
+  if (max < (1 << 30))
+    return random_max(max);
+
+  u64 r, l, m;
+  m = 0xffffffffffffffff;
+  l = m - (m % max);
+  do
+    r = random_u64();
+  while (r >= l);
+  return r % max;
+}