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)