推荐答案
function sampleSize(arr, n) { if (n > arr.length) { throw new Error("n cannot be greater than the length of the array"); } const shuffled = arr.slice().sort(() => Math.random() - 0.5); return shuffled.slice(0, n); }
本题详细解读
1. 函数功能
sampleSize(arr, n)
函数的作用是从数组 arr
中随机选取 n
个元素,并返回这些元素组成的新数组。
2. 参数说明
arr
: 输入的数组,可以是任意类型的元素组成的数组。n
: 需要从数组中随机选取的元素个数。
3. 实现思路
- 边界检查:首先检查
n
是否大于数组的长度。如果n
大于数组长度,则抛出错误,因为无法从数组中选取比其长度更多的元素。 - 数组洗牌:使用
arr.slice()
创建一个数组的副本,避免修改原数组。然后使用sort()
方法结合Math.random()
对数组进行随机排序(洗牌)。 - 选取元素:从洗牌后的数组中截取前
n
个元素,并返回这些元素组成的新数组。
4. 代码解析
arr.slice()
:创建一个数组的副本,避免直接修改原数组。sort(() => Math.random() - 0.5)
:通过随机数生成器对数组进行洗牌。Math.random()
返回一个 0 到 1 之间的随机数,减去 0.5 后,排序函数会随机返回正数或负数,从而实现随机排序。shuffled.slice(0, n)
:从洗牌后的数组中截取前n
个元素。
5. 注意事项
- 该实现使用了
Math.random()
进行洗牌,虽然简单,但在某些情况下可能不够均匀。如果需要更严格的随机性,可以考虑使用 Fisher-Yates 洗牌算法。 - 如果
n
等于数组长度,函数将返回整个数组的随机排列。