Created
March 17, 2025 21:54
March Madness Simulator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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