diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index 4c14164221f97d295b068e9c7535f26467c5bf04..21eadca473ba79209a2d237712b16f1f8fabb802 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -809,19 +809,26 @@ PMOD_EXPORT void f_upper_case(INT32 args)
 PMOD_EXPORT void f_random_string(INT32 args)
 {
   struct pike_string *ret;
-  INT_TYPE len, e;
+  INT_TYPE len, e = 0;
+  unsigned INT32 *str;
   get_all_args("random_string",args,"%+",&len);
   ret = begin_shared_string(len);
 
   /* Note: Assumes pike_string->str is aligned on a 4 byte boundary
    * (it is, currently)
    */
-  len -= sizeof(INT32)-1;
-  for(e=0;e<len;e+=sizeof(INT32))
-      ((unsigned INT32 *)(ret->str+e))[0] = DO_NOT_WARN(my_rand());
-  len += sizeof(INT32)-1;
-  for(;e<len;e++)
-      ret->str[e] = DO_NOT_WARN((char)my_rand());
+  str = (unsigned INT32 *)ret->str;
+
+  while( (e+=sizeof(INT32)) <= len )
+  {
+    str[0] = DO_NOT_WARN(my_rand());
+    str++;
+  }
+
+  for(e-=sizeof(INT32);e<len;e++)
+  {
+    ret->str[e] = DO_NOT_WARN((char)my_rand());
+  }
 
   pop_n_elems(args);
   push_string(end_shared_string(ret));