diff --git a/tools/crypto/bip39-generator.vue b/tools/crypto/bip39-generator.vue
index 6de45651..7a61a98e 100644
--- a/tools/crypto/bip39-generator.vue
+++ b/tools/crypto/bip39-generator.vue
@@ -43,13 +43,13 @@ path: '/bip39-generator'
 
 
diff --git a/utils/random.ts b/utils/random.ts
index 30eb3d2d..d04142b2 100644
--- a/utils/random.ts
+++ b/utils/random.ts
@@ -6,8 +6,25 @@ const randFromArray = (array: any[]) => array[Math.floor(random() * array.length
 
 const randIntFromInterval = (min: number, max: number) => Math.floor(random() * (max - min) + min)
 
+// Durstenfeld shuffle
+const shuffleArrayMutate = (array: T[]): T[] => {
+  for (let i = array.length - 1; i > 0; i--) {
+    const j = Math.floor(Math.random() * (i + 1));
+    [array[i], array[j]] = [array[j], array[i]];
+  }
+
+  return array
+}
+
+const shuffleArray = (array: T[]): T[] => shuffleArrayMutate([...array])
+
+const shuffleString = (str: string, delimiter: string = ''): string => shuffleArrayMutate(str.split(delimiter)).join(delimiter)
+
 export {
   randFromArray,
   randIntFromInterval,
-  random
+  random,
+  shuffleArray,
+  shuffleArrayMutate,
+  shuffleString
 }
diff --git a/utils/string.ts b/utils/string.ts
index ae315aa0..930cbdf6 100644
--- a/utils/string.ts
+++ b/utils/string.ts
@@ -1,5 +1,3 @@
 const capitalise = (s: string) => s.charAt(0).toUpperCase() + s.slice(1)
 
-const shuffle = (s: string) => s.split('').sort(() => 0.5 - Math.random()).join('')
-
-export {capitalise, shuffle}
+export {capitalise}