MontyHall / app.py
0xarnav's picture
Switch iterations with doors
e82d1e2 verified
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]}%")