|
| 1 | +import numpy as np |
| 2 | +import matplotlib.pyplot as plt |
| 3 | +from .base import Experiment |
| 4 | +import streamlit as st |
| 5 | + |
| 6 | +class CoinFlipExperiment(Experiment): |
| 7 | + def run(self): |
| 8 | + col1, col2, col3 = st.columns([1, 1, 1]) |
| 9 | + |
| 10 | + with col1: |
| 11 | + num_flips = st.slider("Number of flips", 1, 10000, 100) |
| 12 | + flips = np.random.choice(['Heads', 'Tails'], size=num_flips) |
| 13 | + unique, counts = np.unique(flips, return_counts=True) |
| 14 | + probabilities = dict(zip(unique, counts/num_flips)) |
| 15 | + st.metric("Heads Probability", f"{probabilities.get('Heads', 0):.3f}") |
| 16 | + st.metric("Tails Probability", f"{probabilities.get('Tails', 0):.3f}") |
| 17 | + |
| 18 | + with col2: |
| 19 | + fig, ax = plt.subplots() |
| 20 | + ax.bar(probabilities.keys(), probabilities.values()) |
| 21 | + ax.set_ylabel('Probability') |
| 22 | + ax.set_title(f'Probability Distribution ({num_flips} flips)') |
| 23 | + st.pyplot(fig) |
| 24 | + |
| 25 | + with col3: |
| 26 | + st.write("Coin Flip Properties:") |
| 27 | + st.write(""" |
| 28 | + - Each flip is independent |
| 29 | + - Probability of heads = 0.5 |
| 30 | + - Probability of tails = 0.5 |
| 31 | + - Expected value = 0.5 |
| 32 | + - Variance = 0.25 |
| 33 | + """) |
| 34 | + st.markdown("📚 **Learn More:** [Coin Flipping Probability](https://en.wikipedia.org/wiki/Coin_flipping#Physics)") |
| 35 | + |
| 36 | + def get_description(self) -> str: |
| 37 | + return "Simulate coin flips and observe probability distribution" |
0 commit comments