| import random | |
| import streamlit as st | |
| import altair as alt | |
| import pandas as pd | |
| import time | |
| st.title("Monty Hall Problem Simulator") | |
| def simulate(iterations, no_of_doors): | |
| if no_of_doors < 3: | |
| st.warning("Number of doors must be at least 3", icon="π") | |
| return | |
| switch_win = 0 | |
| remain_win = 0 | |
| data = [] | |
| st.write(f"Simulation will loop for {iterations} iterations, with {no_of_doors} doors.") | |
| progress_bar = st.progress(0) | |
| chart_placeholder = st.empty() | |
| for _iter in range(iterations): | |
| doors = [0] * no_of_doors | |
| car_door = random.randint(0, len(doors) - 1) | |
| doors[car_door] = 1 | |
| choice_door = random.randint(0, len(doors) - 1) | |
| open_door = random.choice([i for i in range(len(doors)) if doors[i] == 0 and i != choice_door]) | |
| if doors[choice_door] == 1: | |
| remain_win += 1 | |
| else: | |
| switch_win += 1 | |
| data.append({ | |
| 'Iteration': _iter + 1, | |
| 'Switch Wins %': (switch_win / (_iter + 1)) * 100, | |
| 'Remain Wins %': (remain_win / (_iter + 1)) * 100 | |
| }) | |
| progress_bar.progress((_iter + 1) / iterations) | |
| results_df = pd.DataFrame(data) | |
| line_chart = alt.Chart(results_df).mark_line().encode( | |
| x='Iteration:Q', | |
| y='value:Q', | |
| color='variable:N', | |
| tooltip=['Iteration:Q', 'value:Q', 'variable:N'] | |
| ).transform_fold( | |
| ['Switch Wins %', 'Remain Wins %'], | |
| as_=['variable', 'value'] | |
| ).properties( | |
| title='Winning Outcomes Over Iterations' | |
| ) | |
| chart_placeholder.altair_chart(line_chart, use_container_width=True) | |
| time.sleep(0.1) | |
| return pd.DataFrame(data) | |
| with st.form("Input"): | |
| no_of_doors = st.number_input("Enter number of doors", value=3) | |
| iterations = st.number_input("Enter number of iterations", value=100) | |
| state = st.form_submit_button("Start", type="primary") | |
| if state: | |
| if no_of_doors < 3: | |
| st.warning("No of doors must be at least 3", icon="π") | |
| else: | |
| results_df = simulate(iterations, no_of_doors) | |
| st.write(f"Winning scenarios for switching doors: {round(results_df['Switch Wins %'].iloc[-1]*iterations/100)}") | |
| st.write(f"Winning scenarios for sticking to the same door: {round(results_df['Remain Wins %'].iloc[-1]*iterations/100)}") | |
| st.write(f"Winning percentage for switching doors: {results_df['Switch Wins %'].iloc[-1]}%") | |
| st.write(f"Winning percentage for sticking to the same door: {results_df['Remain Wins %'].iloc[-1]}%") |