diff --git a/src/renderer/utils/shuffle.ts b/src/renderer/utils/shuffle.ts index c25455a1d..35c5b1a54 100644 --- a/src/renderer/utils/shuffle.ts +++ b/src/renderer/utils/shuffle.ts @@ -1,22 +1,22 @@ export function shuffle(array: T[]): T[] { - // Create a copy of the array to avoid mutating the original - const shuffled = [...array]; - - // Loop through the array from the last element to the first - for (let i = shuffled.length - 1; i > 0; i--) { - // Generate a random index from 0 to i - const j = Math.floor(Math.random() * (i + 1)); - // Swap elements at positions i and j - [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; - } - - return shuffled; + return shuffleInPlace(array.slice()); } export function shuffleInPlace(array: T[]): T[] { for (let i = array.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); + const j = Math.floor(cryptoRandom() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } return array; } + +const randomBuffer = new Uint32Array(1); + +/** + * Returns a cryptographically secure random float in [0, 1), + * matching the contract of Math.random(). + */ +function cryptoRandom(): number { + crypto.getRandomValues(randomBuffer); + return randomBuffer[0] / 0x100000000; +}