class CwCardUtils::SynergyProbability

def prob_two_card_combo(names, draws)

Exact for 2-card combos
def prob_two_card_combo(names, draws)
  draws_clamped = clamp_draws(draws)
  copies_a = copies_by_name[names[0]]
  copies_b = copies_by_name[names[1]]
  total = hypergeometric(@deck_size, draws_clamped).to_f
  # Probability missing A
  miss_a = hypergeometric(@deck_size - copies_a, draws_clamped) / total
  # Probability missing B
  miss_b = hypergeometric(@deck_size - copies_b, draws_clamped) / total
  # Probability missing both
  miss_both = hypergeometric(@deck_size - (copies_a + copies_b), draws_clamped) / total
  # Inclusion–exclusion
  prob = 1 - (miss_a + miss_b - miss_both)
  prob.clamp(0.0, 1.0)
end