不同编程语言擅长的领域
熟练地掌握编程描述概率问题,不仅帮助我们理解概率中极易混淆的概念,而且能直接验证概率问题。同时,运用编程在解决概率问题又能令孩子们体验到编程的魅力。今天的任务不仅需要能够将任务拆解为子任务,而且,大喵老师给出一个极易误导的错误写法,令孩子们有机会洞察概率的本质。
情景导入:假设丁丁猫组织户外STEM活动为期8天,准备阶段分工有一项是列清单,出行和活动需要的准备的东西。mcree同学负责统筹预判每个需要考虑的因数。首先,天气是重要的影响因素。活动准备两套方案,一套是雨天的活动方案,另一套是晴天的活动方案。
Phil同学找到当地的天气数据看9月份户外地点的降雨概率是25%,晴天的概率是75%,mcree委托phil同学判断两个事件发生的概率:
A、8天的活动期间全部晴天的概率和
B、前4天晴天,第5天转雨天的概率
Phil同学在这两者之间比较,A和B 谁出现的概率更大?思路梳理:数学角度看,两个方案在前四天都是雨天,所以两个方案前四天的概率是相同的。问题就转换为:第5天转为晴天的概率,与接下来连续4天都是雨天的概率比较谁更大?课堂的游戏规则是分两组分工,一组数学思路解;另一组运用编程思维转换为可编程计算的任务**。每个人都可以在老师启发下开始:1、你的直觉是什么结果?
2、如何理解连续发生的事件和单一事件的概率?
3、某一天下雨的概率和连续几天下雨的概率之间的关系
Ada同学经过思考,任务可以用random函数,随机生成某一天的天气
下面是列表包含了3个s,s= sunny晴天和1个雨天:r = rain
非常直观的表达雨天的概率是25%
import random
sun_rain = ['r','s','s','s']
today = random.choice(sun_rain)
Ada受到以上启发,想出一个办法模拟连续n天的天气随机结果:
前4天连续晴天,第5天下雨的事件A的概率
连续8天都是晴天,即事件B的概率
事件A:for循环100000次,每一次random函数生成的“s"或"r"拼接为字符串,运用count函数计算字符串中"rrrrs"的出现的次数累积起来;
事件B:for循环100000次,每一次random函数生成的“s"或"r"拼接为字符串,运用count函数计算字符串中"ssssssss"的出现次数累积起来;
代码如下:
import random
def randomSR():
sun_rain = ['r','s','s','s']
s = ''
for _ in range(10000):
s += random.choice(sun_rain)
prob_A = ''.join(s).count("rrrrs")
prob_B = ''.join(s).count("ssssssss")
return prob_A,prob_B
print('the 1st:',randomSR())
结果:
the 1st: (311, 2805)
结果是不是违反直觉!连续8天都是晴天的概率竟然远远大于连续4天晴天且第5天下雨的概率!
Ada疑惑地将结果告诉大喵老师后,大喵老师并没有直接告诉Ada,她的算法是正确还是错误
但是,大喵老师请同学们一起讨论Ada的算法!
同学们都陷入长时间的思考 ... ... 有同学感到哪里不对劲,但指不出究竟问题在哪儿?
大喵老师给出一个随机生成的长度是60的字符串,分别运用两种算法得到不同的结果!
第一种写法是Ada的思路,统计连续字符串出现的次数;
第二种写法是字符串最左边开始滑动窗口,窗口的大小分别是5和8,循环截至时,统计
两个字符串出现的次数!
# 第一种写法是Ada的算法
ls = '' #初始化字符串
sun_rain = ['r', 's', 's', 's']
for d in range(60): #模拟60天
ls += random.choice(sun_rain)
print('ls:',ls)
print('five_day:',ls.count("ssssr"))
print('eight_day:',ls.count("ssssssss"))
输出结果
five_day: 4
eight_day: 3
第二种写法是老师的推荐:
# 每一次从相同位置开始,分别切片5和8试试看
# 滑动向右第 i 天开始分别切片:
# 前4天晴天,第5天雨天,切5个长度[i : i+6]
# 连续8天是晴天,切8个长度:[i : i+8]
five_day, eight_day = 0 , 0
for i in range(len(ls) - 8):
if ls[i:i + 5] == 'ssssr':
five_day += 1
elif ls[i:i + 8] == "ssssssss":
eight_day += 1
print("five_day:",five_day,"eight_day:",eight_day)
five_day: 4 eight_day: 9
比较两种结果,连续8天都是晴天的次数由3次,变为9次,为什么同一随机样本产生不同的结果?
课堂将展开讨论。
Ada依照第二种思路改变算法后:
def randomSR_2nd():
sun_rain = ['r', 's', 's', 's']
eight,fifth = 0,0
s = ''
for _ in range(100000):
s += random.choice(sun_rain)
#print(s)
for i in range(len(s)-8):
if s[i:i+5] == 'ssssr':
fifth += 1
elif s[i:i+8] == "ssssssss":
eight += 1
return fifth,eight,round(eight/fifth,5)
print('the 2nd:',randomSR_2nd())
输出的新结果:
the 2nd: (7880, 9996, 1.26853)
输出结果的解读是,连续8天都是晴天的概率大于连续4天晴天且第5天是雨天的概率!
而且,前者是后者的1.26853倍,保留5位小数;
大喵老师留给大家一个问题:从数学角度如何解释以上结果?
print(round(0.75**4 / 0.25,5))
1.26562
数学解法的思路:
前4天都是晴天的概率是 0.75 ** 4, 第5天是晴天的概率是 0.25
后4天都是晴天的概率也是0.75 ** 4,那么前后比较得到:
0.75 ** 4 / 0.25 = 1.26562