Contents

import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import widgets, interactive
from IPython.display import display

# 设置中文字体
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False

# 创建一个文本框和一个按钮
num_coins = widgets.IntSlider(
    value=30,
    min=10,
    max=200,
    step=10,
    description='硬币个数:',
    continuous_update=False
)

num_trials = widgets.IntSlider(
    value=10,
    min=1,
    max=20,
    step=1,
    description='实验次数:',
    continuous_update=False
)

# 定义可视化函数
def visualize_coin_tosses(num_coins, num_trials):
    plt.figure(figsize=(8, 6))
    
    # 存储每次实验的结果
    all_proportions = []
    
    for trial in range(num_trials):
        # 抛硬币实验
        tosses = np.random.binomial(1, 0.5, num_coins)
        # 计算正面朝上的频率
        proportions = np.cumsum(tosses) / np.arange(1, num_coins + 1)
        all_proportions.append(proportions)
        
        # 绘制当前实验的频率变化(移除 label 参数)
        plt.plot(np.arange(1, num_coins + 1), proportions, alpha=0.7)
    
    # 绘制期望值(0.5)
    plt.axhline(y=0.5, color='black', linestyle='--', linewidth=2)
    
    # 设置图表属性
    plt.title(f'抛硬币实验结果({num_coins}个硬币,{num_trials}次实验)')
    plt.xlabel('抛硬币次数')
    plt.ylabel('正面朝上的频率')
    plt.ylim(0, 1)
    plt.grid(True)
    
    plt.tight_layout()
    plt.show()

# 创建交互式界面
interactive_plot = interactive(
    visualize_coin_tosses,
    num_coins=num_coins,
    num_trials=num_trials
)

# 显示界面
display(interactive_plot)