加权随机抽样
使用提供的 weights
作为每个元素的概率,从数组中获取一个随机元素。
- 使用
Array.prototype.reduce()
创建一个包含每个weights
值的部分和数组。 - 使用
Math.random()
生成一个随机数,并使用Array.prototype.findIndex()
基于之前生成的数组找到正确的索引。 - 最后,返回
arr
中对应索引的元素。
const weightedSample = (arr, weights) => {
let roll = Math.random();
return arr[
weights
.reduce(
(acc, w, i) => (i === 0 ? [w] : [...acc, acc[acc.length - 1] + w]),
[]
)
.findIndex((v, i, s) => roll >= (i === 0 ? 0 : s[i - 1]) && roll < v)
];
};
weightedSample([3, 7, 9, 11], [0.1, 0.2, 0.6, 0.1]); // 9