diff --git a/lib/modules/Crypto/randomness.pmod b/lib/modules/Crypto/randomness.pmod
index 03054e6e1cbea8d8e1b769b529a203877a91ad17..2c6e9435c52c5d0e03b2045c1d63293150100b2a 100644
--- a/lib/modules/Crypto/randomness.pmod
+++ b/lib/modules/Crypto/randomness.pmod
@@ -70,10 +70,8 @@ PRIVATE string some_entropy()
 class pike_random {
   string read(int len)
   {
-    return sprintf("%@c", Array.map(allocate(len), lambda(int dummy)
-				    {
-				      return random(256);
-				    } ));
+    if (len > 16384) return read(len/2)+read(len-len/2);
+    return (string)allocate(len, random)(256);
   }
 }