diff --git a/src/noise.cpp b/src/noise.cpp
index c36b33db86828df9d0d04d8265b66d15508a6107..bb7c9969e1574f399fa40ca090e08fa2701a373b 100644
--- a/src/noise.cpp
+++ b/src/noise.cpp
@@ -123,35 +123,20 @@ s32 PcgRandom::range(s32 min, s32 max)
 
 void PcgRandom::bytes(void *out, size_t len)
 {
-	u32 r;
 	u8 *outb = (u8 *)out;
+	int bytes_left = 0;
+	u32 r;
 
-	size_t len_alignment = (uintptr_t)out % sizeof(u32);
-	if (len_alignment) {
-		len -= len_alignment;
-		r = next();
-		while (len_alignment--) {
-			*outb = r & 0xFF;
-			outb++;
-			r >>= 8;
+	while (len--) {
+		if (bytes_left == 0) {
+			bytes_left = sizeof(u32);
+			r = next();
 		}
-	}
 
-	size_t len_dwords = len / sizeof(u32);
-	while (len_dwords--) {
-		r = next();
-		*(u32 *)outb = next();
-		outb += sizeof(u32);
-	}
-
-	size_t len_remaining = len % sizeof(u32);
-	if (len_remaining) {
-		r = next();
-		while (len_remaining--) {
-			*outb = r & 0xFF;
-			outb++;
-			r >>= 8;
-		}
+		*outb = r & 0xFF;
+		outb++;
+		bytes_left--;
+		r >>= 8;
 	}
 }