推荐答案
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等于数组长度,函数将返回整个数组的随机排列。