Что такое парадокс Монти Холла и как он связан с тестированием?

«Что такое парадокс Монти Холла и как он связан с тестированием?» — вопрос из категории Other, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Парадокс Монти Холла — это вероятностная задача, наглядно демонстрирующая, как интуитивные представления о вероятности могут быть ошибочными. В контексте QA она иллюстрирует важность понимания теории вероятностей для анализа рисков и результатов тестирования.

Суть парадокса:

  1. Есть 3 двери, за одной — приз (баг), за двумя — козы (рабочая функциональность).
  2. Тестировщик выбирает дверь (гипотезу о месте бага).
  3. Ведущий (система, логи), зная где приз, открывает одну из оставшихся дверей с козой (показывает, что в одном из модулей бага точно нет).
  4. У тестировщика есть выбор: стоять на своем (вероятность найти баг = 1/3) или сменить дверь (вероятность = 2/3).

Связь с тестированием:

  • Анализ рисков: Приоритизация областей тестирования должна учитывать априорные вероятности наличия дефектов (например, в новом или сложном модуле "приз" может быть с большей вероятностью).
  • Интерпретация результатов: Если один тест не нашел баг ("открыта дверь с козой"), это меняет вероятность его наличия в оставшихся непроверенных компонентах.
  • Статистические методы: Понимание таких парадоксов важно для A/B-тестирования, анализа результатов автоматических проверок и оценки покрытия.

Простой код для симуляции (Python):

import random

def simulate_monty_hall(trials=10000, switch=True):
    wins = 0
    for _ in range(trials):
        doors = ['goat', 'goat', 'car']
        random.shuffle(doors)
        initial_choice = random.randint(0, 2)
        # Ведущий открывает дверь с козой
        host_choice = random.choice([i for i in range(3) if i != initial_choice and doors[i] == 'goat'])
        if switch:
            # Игрок меняет выбор на оставшуюся закрытую дверь
            final_choice = [i for i in range(3) if i not in (initial_choice, host_choice)][0]
        else:
            final_choice = initial_choice
        if doors[final_choice] == 'car':
            wins += 1
    return wins / trials

print(f"Вероятность при смене выбора: {simulate_monty_hall(switch=True):.2%}")
print(f"Вероятность без смены: {simulate_monty_hall(switch=False):.2%}")