Skip to content

Instantly share code, notes, and snippets.

@CoreyMSchafer
Created March 17, 2025 21:54
March Madness Simulator
import random
from dataclasses import dataclass
@dataclass
class Team:
name: str
seed: int
first_round = [
# SOUTH
(Team("Auburn", seed=1), Team("Alabama ST/Saint Francis U", seed=16)),
(Team("Louisville", seed=8), Team("Creighton", seed=9)),
(Team("Michigan", seed=5), Team("UC San Deigo", seed=12)),
(Team("Texas A&M", seed=4), Team("Yale", seed=13)),
(Team("Ole Miss", seed=6), Team("San Deigo St/North Carolina", seed=11)),
(Team("Iowa St.", seed=3), Team("Lipscomb", seed=14)),
(Team("Marquette", seed=7), Team("New Mexico", seed=10)),
(Team("Michigan St.", seed=2), Team("Bryant", seed=15)),
# WEST
(Team("Florida", seed=1), Team("Norfolk St.", seed=16)),
(Team("UConn", seed=8), Team("Oklahoma", seed=9)),
(Team("Memphis", seed=5), Team("Colorado St.", seed=12)),
(Team("Maryland", seed=4), Team("Grand Canyon", seed=13)),
(Team("Missouri", seed=6), Team("Drake", seed=11)),
(Team("Texas Tech", seed=3), Team("UNC Willington", seed=14)),
(Team("Kansas", seed=7), Team("Arkansas", seed=10)),
(Team("St. John's", seed=2), Team("Omaha", seed=15)),
# EAST
(Team("Duke", seed=1), Team("America/Mount St Mary's", seed=16)),
(Team("Mississippi St.", seed=8), Team("Baylor", seed=9)),
(Team("Oregon", seed=5), Team("Liberty", seed=12)),
(Team("Arizona", seed=4), Team("Akron", seed=13)),
(Team("BYU", seed=6), Team("VCU", seed=11)),
(Team("Wisconsin", seed=3), Team("Montana", seed=14)),
(Team("Saint Mary's", seed=7), Team("Vanderbilt", seed=10)),
(Team("Alabama", seed=2), Team("Robert Morris", seed=15)),
# MIDWEST
(Team("Houston", seed=1), Team("SIU Edwardsville", seed=16)),
(Team("Gonzaga", seed=8), Team("Georgia", seed=9)),
(Team("Clemson", seed=5), Team("McNeese", seed=12)),
(Team("Purdue", seed=4), Team("High Point", seed=13)),
(Team("Illinois", seed=6), Team("Texas/Xavier", seed=11)),
(Team("Kentucky", seed=3), Team("Troy", seed=14)),
(Team("UCLA", seed=7), Team("Utah St.", seed=10)),
(Team("Tennessee", seed=2), Team("Wofford", seed=15)),
]
def simulate_game(team1, team2):
team1_seed_weight = 1 / (team1.seed)
team2_seed_weight = 1 / (team2.seed)
# Uncomment the following lines to use a power for seed weighting (higher power means more weight to better seeds)
# power = 1.1618
# team1_seed_weight = 1 / (team1.seed**power)
# team2_seed_weight = 1 / (team2.seed**power)
# Convert to probabilities
total = team1_seed_weight + team2_seed_weight
team1_prob = 100 * (team1_seed_weight / total)
team2_prob = 100 * (team2_seed_weight / total)
# Get winner based on probabilities
winner = random.choices([team1, team2], weights=[team1_prob, team2_prob], k=1)[0]
print(
f"{team1.name}-{team1.seed} ({team1_prob:.1f}%) vs {team2.name}-{team2.seed} ({team2_prob:.1f}%), Winner: {winner.name}",
)
return winner
def simulate_tournament(first_round):
current_games = first_round
while len(current_games) > 0:
print("\n===== NEW ROUND =====")
winners = []
for team1, team2 in current_games:
winner = simulate_game(team1, team2)
winners.append(winner)
if len(winners) == 1:
return winners[0]
next_round = []
for i in range(0, len(winners), 2):
next_round.append((winners[i], winners[i + 1]))
current_games = next_round
return None
winner = simulate_tournament(first_round)
print(f"\n{winner.name} wins the tournament!")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment