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}