/** * 随机从数组中选取一个元素 * @param arr */ export function rollPick(arr: T[]): T export function rollPick(arr: T[], pickCount: number): T[] export function rollPick(arr: T[], pickCount?: number): T | T[] { // 参数验证 if (!Array.isArray(arr) || arr.length === 0) { throw new Error("Input array cannot be empty") } // 如果没有指定pickCount或pickCount为1,返回单个元素 if (!pickCount || pickCount === 1) { const index = Math.floor(Math.random() * arr.length) return arr[index] } // 验证pickCount if (pickCount <= 0) { pickCount = 1 } if (pickCount > arr.length) { pickCount = arr.length } // 复制原数组避免修改原数组 const shuffled = [...arr] // Fisher-Yates洗牌算法选取多个元素 for (let i = shuffled.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)) ;[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]] } // 返回前pickCount个元素 return shuffled.slice(0, pickCount) }