抽奖”再来一瓶“,到底买多少瓶才能中一次奖,背后的几何分布奥秘到底是什么
一、故事内容
小明去商店买饮料,瓶盖上有“再来一瓶”活动。
商家宣传:中奖率 15%。
小明就想:
- 如果连续买n多瓶,至少中 1 次的概率到底有多大?
- 用 Python 模拟,多次实验,看看实际情况和理论分析是否一致?
这就是一个典型的概率 + 编程模拟问题。
二、对应的数学知识
1. 单次中奖概率
设每次买 1 瓶,中奖概率为:
不中奖概率为:
2. 买 n 瓶,至少中 1 次的概率
“至少中 1 次”更容易用反面事件计算:
所以:
例如:
3. 平均要买多少瓶才能中 1 次
这是几何分布的期望值:
含义:长期平均来看,大约买 6 到 7 瓶会中 1 次。
注意:
三、数学建模
问题分析
模型步骤
- 使用
random.random() 生成 [0, 1) 的随机数
四、Python 代码实现
import randomdef 抽奖(p=0.15):""" 单次抽奖:返回是否中奖 """return random.random() < pdef 抽到一次奖(p=0.15):""" 单次实验:不断购买,直到第一次中奖 返回购买瓶数 """ count = 0whileTrue: count += 1if 抽奖(p):return countdef 模拟抽10次(times=10, p=0.15):""" 重复 trials 次“直到中奖”实验 返回每次结果和平均购买瓶数 """ results = []for _ in range(times): results.append(抽到一次奖(p)) average = sum(results) / len(results)return results, averageif __name__ == "__main__": p = 0.15 print("=" * 50) print("再来一瓶中奖率分析") print("=" * 50) print("\n一、模拟实验(循环 10 次,每次直到中奖)") results, avg = 模拟抽10次(times=10, p=p)for i in range(len(results)): print(f"第 {i+1}次:买了 {results[i]:3d} 瓶才中奖") print(f"10次平均购买瓶数:{avg:.2f}") print("\n说明:") print("- 理想平均中奖间隔 = 6.67 次(理论值)") print(f"- 模拟实验的结果是 {avg:.2f} 次(平均值)") print(f" 如果模拟次数无限大的时候,平均值会趋近于理论值 {1/p:.2f} 次")
五、示例输出(每次运行会略有不同)
==================================================再来一瓶中奖率分析==================================================一、模拟实验(循环 10 次,每次直到中奖)第 1次:买了 2 瓶才中奖第 2次:买了 3 瓶才中奖第 3次:买了 17 瓶才中奖第 4次:买了 22 瓶才中奖第 5次:买了 12 瓶才中奖第 6次:买了 14 瓶才中奖第 7次:买了 5 瓶才中奖第 8次:买了 19 瓶才中奖第 9次:买了 14 瓶才中奖第 10次:买了 3 瓶才中奖10次平均购买瓶数:11.10说明:- 理想平均中奖间隔 = 6.67 次(理论值)- 模拟实验的结果是 11.10 次(平均值) 如果模拟次数无限大的时候,平均值会趋近于理论值 6.67 次
六、总结
- 15% 的中奖率意味着平均每 6.67 瓶会中一次奖,但实际情况可能会有较大波动。