diff --git a/lib/srfi/27/rand.c b/lib/srfi/27/rand.c
index 8946f176..be286c57 100644
--- a/lib/srfi/27/rand.c
+++ b/lib/srfi/27/rand.c
@@ -55,7 +55,8 @@ typedef unsigned int sexp_random_t;
 
 sexp sexp_rs_random_integer (sexp ctx, sexp self, sexp_sint_t n, sexp rs, sexp bound) {
   sexp res;
-  sexp_int32_t m;
+  int64_t m;
+  sexp_int32_t m2;
 #if SEXP_USE_BIGNUMS
   sexp_uint_t mod;
   sexp_uint32_t *data;
@@ -67,7 +68,11 @@ sexp sexp_rs_random_integer (sexp ctx, sexp self, sexp_sint_t n, sexp rs, sexp b
     if (sexp_unbox_fixnum(bound) <= 0) {
       res = sexp_xtype_exception(ctx, self, "random bound must be positive", bound);
     } else {
-      sexp_call_random(rs, m);
+      /* ensure we have sufficient bits */
+      for (i=m=0; i <= 1<<(CHAR_BIT*sizeof(m))/RAND_MAX; ++i) {
+        sexp_call_random(rs, m2);
+        m = m * RAND_MAX + m2;
+      }
       res = sexp_make_fixnum(m % sexp_unbox_fixnum(bound));
     }
 #if SEXP_USE_BIGNUMS