diff --git a/util/odds.py b/util/odds.py new file mode 100644 index 0000000..4c7f9e5 --- /dev/null +++ b/util/odds.py @@ -0,0 +1,65 @@ +""" + util/odds.py + + Calculate the odds of winning a lottery game +""" + +from math import comb + + +def calculate_odds(pool_size: int, draw_count: int) -> int: + """ + Calculate the total number of possible combinations in a set of numbers with a specific draw count. + + :param pool_size: Total count of numbers in the pool + :param draw_count: The count of numbers to draw from the pool + :return: The total number of possible combinations + + Example: + If a lottery game has a main ball pool of 49 numbers from which 5 numbers are drawn and a pool of + 18 numbers from which 1 number is drawn (game ball), calculate the odds of winning that game. + + >>> calculate_odds(pool_size=49, draw_count=5) + 1906884 + >>> calculate_odds(pool_size=18, draw_count=1) + 18 + """ + + if draw_count < 0 or draw_count > pool_size: + raise ValueError('Integer values must be positive and draw counts must be less than pool size.') + total_combinations = comb(pool_size, draw_count) + return total_combinations + + +def get_odds_of_winning( + main_ball_draw_pool: int, + main_ball_draw_count: int, + game_ball_draw_pool: int, + game_ball_draw_count: int +) -> str: + """ + Calculate the odds of winning a specific lottery game with one draw + + :param main_ball_draw_pool: Total count of numbers in the main ball pool + :param main_ball_draw_count: The count of numbers to draw from the main ball pool + :param game_ball_draw_pool: Total count of numbers in the game ball pool + :param game_ball_draw_count: The count of numbers to draw from the game ball pool + + :return: The odds of winning a specific lottery game with one draw + + Example: + To calculate the odds of winning a lottery game with 5 numbers drawn from a main ball pool of 49 and + 1 number drawn from a game ball pool of 19 numbers. + + >>> get_odds_of_winning(main_ball_draw_pool=49, main_ball_draw_count=5, game_ball_draw_pool=18, game_ball_draw_count=1) + 'The odds of winning are 1 in 34,323,912' + """ + + if (main_ball_draw_count < 0 or main_ball_draw_count > main_ball_draw_pool or + game_ball_draw_count < 0 or game_ball_draw_count > game_ball_draw_pool): + raise ValueError('Integer values must be positive and draw counts must be less than pool size.') + + main_ball_odds = calculate_odds(main_ball_draw_pool, main_ball_draw_count) + game_ball_odds = calculate_odds(game_ball_draw_pool, game_ball_draw_count) + + return f"The odds of winning are 1 in {main_ball_odds * game_ball_odds:,}"