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]}%")