Я пытался смоделировать случайные вероятности и нашел кое-что интересное с помощью Array.findIndex
const probabilities = [0.1, 0.2, 0.3];
const thresholds = probabilities.reduce((r, p, i) => r.concat((r[i - 1] || 0) + p), []);
const f1 = () => thresholds.findIndex(x => x > Math.random());
const f2 = () => {
const r = Math.random();
for (let i = 0; i < thresholds.length; i++)
if (r < thresholds[i])
return i;
return -1;
};
const run = (f) => Array.from(Array(1000000), f).reduce((r, x) => Object.assign(r, { [x]: 1 + (r[x] || 0) }), {});
run(f1);
run(f2);
Результаты вывода были примерно такими:
{ "0": 100210, "1": 269763, "2": 377463, "-1": 252564 }
{ "0": 99381, "1": 199927, "2": 300408, "-1": 400284 }
Очевидно, Array.findIndex
в паре с Math.random
работает не так, как я предполагал.