From 51b6e284b945566eadfe3887690f08b597f1abdf Mon Sep 17 00:00:00 2001 From: LOG1997 <2694233102@qq.com> Date: Mon, 8 Dec 2025 22:41:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(utils):=20=E6=B7=BB=E5=8A=A0=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=B4=97=E7=89=8C=E4=B8=8E=E9=9A=8F=E6=9C=BA=E6=8A=BD?= =?UTF-8?q?=E6=A0=B7=E5=87=BD=E6=95=B0=20Feature=20#91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/Home/utils/random.ts | 53 ++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/views/Home/utils/random.ts diff --git a/src/views/Home/utils/random.ts b/src/views/Home/utils/random.ts new file mode 100644 index 0000000..acb2dd1 --- /dev/null +++ b/src/views/Home/utils/random.ts @@ -0,0 +1,53 @@ +/** + * 浏览器端加密安全洗牌(无需指定抽取数量) + * @param array 要洗牌的数组 + * @returns 洗牌后的新数组 + */ +function shuffleBrowserCrypto(array: T[]): T[] { + const newArray = [...array] + if (newArray.length <= 1) + return newArray + + // 遍历数组,每轮生成一个随机索引 + for (let i = newArray.length - 1; i > 0; i--) { + // 步骤1:生成一个 32 位无符号加密随机数(仅需1个) + const randomBuffer = new Uint32Array(1) // 长度1表示只生成1个随机数 + crypto.getRandomValues(randomBuffer) + + // 步骤2:将随机数映射到 [0, i] 范围(核心:动态适配当前i的范围) + const randomIndex = randomBuffer[0] % (i + 1); + + // 步骤3:交换元素 + [newArray[i], newArray[randomIndex]] = [newArray[randomIndex], newArray[i]] + } + return newArray +} + +/** + * @description 从源数组中随机获取指定数量的元素 + * @param {Array} sourceArray 源数组 + * @param {number} count 要获取的元素数量 + * @returns {Array} 随机获取的元素 + */ + +export function getRandomElements(sourceArray: T[], count: number): T[] { + if (count <= 0) + return [] + if (count >= sourceArray.length) { + return shuffleBrowserCrypto([...sourceArray]) + } // 抽全部=洗牌 + + const newArray = [...sourceArray] + const result: T[] = [] + + // 抽取 count 个元素,每轮选一个随机索引加入结果,然后从原数组移除 + for (let i = 0; i < count; i++) { + const randomBuffer = new Uint32Array(1) + crypto.getRandomValues(randomBuffer) + const randomIndex = randomBuffer[0] % newArray.length + + result.push(newArray[randomIndex]) + } + + return result +}