Вычисление зависимой последовательной вероятности с использованием JS для n раз

#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. Вычислите общее значение внутри цикла или сохраните его в переменной вне цикла, которая не будет переназначена