Как получить взвешенную выборку из массива в JavaScript
Чтобы случайным образом получить элемент из массива на основе предоставленных весов, следуйте этим шагам:
- Откройте Терминал/SSH и введите
node
, чтобы начать практиковать программирование.
- Используйте
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