В чем фокус в javascript Array.findIndex - PullRequest
0 голосов
/ 10 июля 2020

Я пытался смоделировать случайные вероятности и нашел кое-что интересное с помощью 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 работает не так, как я предполагал.

1 Ответ

1 голос
/ 10 июля 2020

Вы каждый раз сравниваете новое, другое случайное число, поэтому результаты непредсказуемы. Во второй функции вы этого не делаете, вы создаете одно число и сохраняете его в r, а затем проверяете с ним все пороги.

То же самое можно сделать и с findIndex:

const f1 = () => {
  const r = Math.random();
  return thresholds.findIndex(x => x > r);
};
...