#javascript #probability
Вопрос:
У меня есть массив, содержащий n типов шариков, вот упрощенный пример:
let marbles = [ {variable: “Green marbles”, text: “Green marble”, amount: 10}, {variable: “Yellow marbles”, text: “Yellow marble”, amount: 12}, {variable: “Pink marbles”, text: “Pink marble”, amount: 8} ]
Что я собираюсь сделать с этим массивом, так это рассчитать вероятность получения зеленого, желтого или розового мрамора последовательно, не заменяя его (это означает, что каждый раз, когда мрамор рисуется, он становится подложкой). Итак, вот пример:
in the first pick, the probability of getting a pink marble is: 8/30. In the second pick, the probability is now: 7/29 * 8/30 In the third pick, the probability is now: 6/28 * 7/29 * 8/30
И так далее. Мне удалось выполнить это, чтобы рассчитать вероятность с заменой примерно так:
let withReplacementArray = [] let i let total = marbles.reduce((prev, cur)=gt; {return prev cur.amount}, 0) marbles.forEach((cur)=gt; { for(i=1; ilt;=total; i ) { withReplacementArray.push({ probability: (Math.pow(cur.amount, i))/(Math.pow(total, i)), n: i, text: cur.text }) } })
Короче говоря, этот метод не будет работать для вычисления вероятности без замены, потому что это уже не так просто, как поднять ее до степени i. Есть какие-нибудь предложения? Или есть какая-то формула, которой я могу следовать, чтобы получить этот результат?
Ответ №1:
Вычтите одно из обоих количеств мрамора (тип, который вас интересует, и общее количество) внутри цикла. Вместо полномочий сохраняйте внешнюю переменную для совокупной вероятности последнего цикла.
let marbles = [ {variable: "Green marbles", text: "Green marble", amount: 10}, {variable: "Yellow marbles", text: "Yellow marble", amount: 12}, {variable: "Pink marbles", text: "Pink marble", amount: 8} ]; // say we want to pick green let greenAmount = marbles[0].amount; let total = marbles.reduce((a, { amount }) =gt; a amount, 0); let lastProbability = 1; while (greenAmount gt; 0) { lastProbability = lastProbability * (greenAmount / total); console.log(lastProbability); greenAmount--; total--; } // 10/30 // then 10/30 * 9/29 // etc
Комментарии:
1. как бы вы сделали так, чтобы он давал решения для каждого мрамора?
2. Сделайте цикл вокруг всего кода вместо жесткого кодирования
marbles[0].amount;
3. Я пытался это сделать, но у меня возникли проблемы с циклом, так как общая сумма не сбрасывается после каждого цвета
4. Вычислите общее значение внутри цикла или сохраните его в переменной вне цикла, которая не будет переназначена