← Назад к вопросам

Как посчитать вероятность события?

1.7 Middle🔥 161 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Расчёт вероятности событий в JavaScript

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

Основная формула вероятности

// P(A) = Количество благоприятных исходов / Общее количество исходов

function calculateProbability(favorableOutcomes, totalOutcomes) {
  if (totalOutcomes === 0) {
    return 0;  // Деление на ноль
  }
  return favorableOutcomes / totalOutcomes;
}

// Примеры
console.log(calculateProbability(1, 6));     // 0.1667 (один кубик, вероятность 1)
console.log(calculateProbability(3, 6));     // 0.5 (вероятность четного числа)
console.log(calculateProbability(13, 52));   // 0.25 (вероятность червей из колоды)

Вероятность в процентах и долях

function probabilityPercent(favorable, total) {
  const prob = favorable / total;
  return (prob * 100).toFixed(2) + '%';
}

function probabilityRatio(favorable, total) {
  // Упростить дробь
  const gcd = (a, b) => b === 0 ? a : gcd(b, a % b);
  const divisor = gcd(favorable, total);
  return `${favorable / divisor}:${total / divisor}`;
}

console.log(probabilityPercent(3, 6));   // '50.00%'
console.log(probabilityRatio(3, 6));     // '1:2'

Простые события

// Вероятность выпадения орла при бросании монеты
const coinFlip = () => {
  const outcomes = ['heads', 'tails'];
  const favorable = 1;  // 'heads'
  const total = outcomes.length;
  return favorable / total;  // 0.5
};

// Вероятность вытянуть красный шар из урны
function ballProbability() {
  const redBalls = 5;
  const blueBalls = 3;
  const totalBalls = redBalls + blueBalls;
  return redBalls / totalBalls;  // 0.625
}

console.log(coinFlip());          // 0.5
console.log(ballProbability());   // 0.625

Сложные события (Умножение вероятностей)

Для независимых событий: P(A и B) = P(A) * P(B)

// Вероятность вытянуть два красных шара подряд (без возврата)
function twoRedBallsWithoutReplacement() {
  const redBalls = 5;
  const blueBalls = 3;
  const total = redBalls + blueBalls;

  const firstRed = redBalls / total;  // 5/8
  const secondRed = (redBalls - 1) / (total - 1);  // 4/7

  return firstRed * secondRed;  // (5/8) * (4/7) = 20/56 ≈ 0.357
}

// С возвратом (независимые события)
function twoRedBallsWithReplacement() {
  const redBalls = 5;
  const total = 8;
  const prob = (redBalls / total) * (redBalls / total);
  return prob;  // (5/8)^2 = 0.391
}

console.log(twoRedBallsWithoutReplacement());  // 0.357
console.log(twoRedBallsWithReplacement());     // 0.391

Сложение вероятностей (Логическое ИЛИ)

Для несовместимых событий: P(A или B) = P(A) + P(B)

// Вероятность выпадения чётного или нечётного числа на кубике
function diceEvenOrOdd() {
  const evenNumbers = 3;  // 2, 4, 6
  const oddNumbers = 3;   // 1, 3, 5
  const total = 6;

  const probEven = evenNumbers / total;
  const probOdd = oddNumbers / total;

  return probEven + probOdd;  // 0.5 + 0.5 = 1.0
}

// Вероятность вытянуть король или туз
function kingOrAce() {
  const kings = 4;
  const aces = 4;
  const total = 52;
  return (kings + aces) / total;  // 8/52 ≈ 0.154
}

console.log(diceEvenOrOdd());   // 1.0
console.log(kingOrAce());       // 0.154

Условная вероятность

Вероятность события A при условии что произошло событие B: P(A|B)

// Вероятность дождя завтра, если уже идёт дождь сегодня
function conditionalRain() {
  const rainyDaysAfterRain = 15;  // Дни с дождём после дождливого дня
  const rainyDaysPreviousDay = 20;  // Всего дождливых дней
  return rainyDaysAfterRain / rainyDaysPreviousDay;  // 0.75
}

// Вероятность купить красный товар, если товар дешёвый
function redGivenCheap() {
  const cheapRed = 10;  // Дешёвые красные товары
  const cheapTotal = 50;  // Все дешёвые товары
  return cheapRed / cheapTotal;  // 0.2
}

Формула Байеса (Обратная условная вероятность)

P(A|B) = P(B|A) * P(A) / P(B)

function bayesTheorem() {
  // Задача: Какова вероятность что у человека болезнь если тест положительный?
  const probDisease = 0.01;  // 1% людей больны
  const probPositiveIfDiseased = 0.95;  // 95% тестов правильные для больных
  const probPositiveIfHealthy = 0.05;   // 5% ложных срабатываний
  const probHealthy = 1 - probDisease;  // 99% здоровы

  // P(болезнь | положительный тест) = ?
  const probPositive = (
    probPositiveIfDiseased * probDisease +
    probPositiveIfHealthy * probHealthy
  );

  const probDiseaseGivenPositive = (
    (probPositiveIfDiseased * probDisease) / probPositive
  );

  return probDiseaseGivenPositive;  // ≈ 0.16 (только 16% вероятность!)
}

console.log(bayesTheorem());  // 0.161

Распределение вероятностей

// Нормальное распределение (Гаусс)
function normalDistribution(x, mean, stdDev) {
  const coefficient = 1 / (stdDev * Math.sqrt(2 * Math.PI));
  const exponent = -Math.pow(x - mean, 2) / (2 * Math.pow(stdDev, 2));
  return coefficient * Math.exp(exponent);
}

// Равномерное распределение
function uniformDistribution(x, a, b) {
  if (x < a || x > b) return 0;
  return 1 / (b - a);
}

// Биномиальное распределение (вероятность k успехов из n попыток)
function binomialDistribution(n, k, p) {
  const combinations = factorial(n) / (factorial(k) * factorial(n - k));
  return combinations * Math.pow(p, k) * Math.pow(1 - p, n - k);
}

function factorial(n) {
  return n <= 1 ? 1 : n * factorial(n - 1);
}

// Примеры
console.log(normalDistribution(0, 0, 1));     // ≈ 0.399
console.log(uniformDistribution(5, 0, 10));   // 0.1
console.log(binomialDistribution(10, 5, 0.5)); // ≈ 0.246

Практический пример: Вероятность клика

class ClickAnalytics {
  constructor() {
    this.impressions = 0;  // Показы
    this.clicks = 0;       // Клики
  }

  recordEvent(clicked) {
    this.impressions++;
    if (clicked) this.clicks++;
  }

  getClickProbability() {
    return this.clicks / this.impressions;
  }

  getClickRate() {
    return (this.getClickProbability() * 100).toFixed(2) + '%';
  }

  expectedClicks(futureImpressions) {
    return Math.round(futureImpressions * this.getClickProbability());
  }
}

const analytics = new ClickAnalytics();
[true, false, true, false, true].forEach(c => analytics.recordEvent(c));

console.log(analytics.getClickProbability());   // 0.6
console.log(analytics.getClickRate());          // '60.00%'
console.log(analytics.expectedClicks(1000));   // 600

Monte Carlo симуляция

function monteCarloPi(iterations = 100000) {
  let circlePoints = 0;

  for (let i = 0; i < iterations; i++) {
    const x = Math.random();
    const y = Math.random();
    const distance = Math.sqrt(x * x + y * y);

    if (distance <= 1) {
      circlePoints++;
    }
  }

  // Вероятность попадания в круг = площадь круга / площадь квадрата
  // pi/4 = circlePoints / iterations
  const piEstimate = (circlePoints / iterations) * 4;
  return piEstimate;
}

console.log(monteCarloPi());  // ≈ 3.14159

Вероятность - мощный инструмент для анализа, предсказаний и принятия решений в приложениях.