How to Get a Weighted Sample from an Array in JavaScript
To randomly get an element from an array based on the provided weights, follow these steps:
- Open the Terminal/SSH and type
node
to start practicing coding.
- Use
Array.prototype.reduce()
to create an array of partial sums for each value in weights
.
- Use
Math.random()
to generate a random number and Array.prototype.findIndex()
to find the correct index based on the array previously produced.
- Finally, return the element of
arr
with the produced index.
Here is the code to achieve this:
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)
];
};
You can test this function by passing an array and its corresponding weights as arguments:
weightedSample([3, 7, 9, 11], [0.1, 0.2, 0.6, 0.1]); // 9