《Python编程快速上手》抛硬币序列习题代码输出异常排查
Python抛硬币连续序列实验代码排错
我正在学习《Automate The Boring Stuff with Python》(中文译名《Python编程快速上手:让繁琐工作自动化》),目前卡在章节练习上,练习具体要求如下:
练习内容
抛硬币连续序列实验:本练习将完成一项统计实验。若抛掷100次硬币,将正面记为“H”、反面记为“T”,最终会得到类似“T T T T H H H H T T”的结果序列。如果让人类手动编造100次随机抛硬币结果,往往会生成类似“H T H T H H T H T T”的正反交替结果——这类结果在人类视角下看似随机,但并不符合数学意义上的真随机特征。人类几乎不会主动写出连续6次正面或连续6次反面的序列,但这类长连续序列在真随机的抛硬币结果中出现概率极高,可见人类对随机性的感知存在可预测的偏差。
编写程序统计随机生成的硬币正反序列中,出现连续6次正面或连续6次反面的频率。程序分为两个部分:第一部分生成由随机选中的'heads'(正面)、'tails'(反面)值组成的序列;第二部分检查序列中是否存在符合要求的连续序列。将上述代码逻辑放入循环中重复实验10000次,最终计算存在至少一段连续6次同面结果的实验占比。提示:函数调用
random.randint(0, 1)将以50%的概率返回0,剩余50%概率返回1。
原实现代码
import random numI = 0 numII = 0 numberOfStreaks = 0 tHlists = [] for experimentNumber in range(10000): for i in range(100): if random.randint(0, 1) == 0: tHlists.append('T') numII = 0 numI += 1 if numI == 6: numberOfStreaks += 1 numI =0 else: tHlists.append('H') numI = 0 numII += 1 if numII == 6: numberOfStreaks += 1 numII = 0 print('Chance of streak: %s%%' % (numberOfStreaks / 100))
问题现象
代码可正常运行,但输出平均结果为159.XX%,概率结果明显不符合逻辑。
错误点梳理
- 统计目标偏差:题目要求统计10000次实验中,至少出现1次连续6次同面结果的实验占比,原代码统计的是所有实验过程中出现连续6次同面的总次数,单轮实验如果出现多段连续序列会被重复计数,和题目要求的统计维度完全不符。
- 计数变量作用域错误:连续正面/反面的计数变量
numI、numII定义在10000次实验的循环外层,上一轮实验结束后的剩余计数会被带入下一轮实验,导致跨实验误判连续序列,计数结果虚高。 - 百分比计算错误:总实验样本量是10000次,原代码最终用
numberOfStreaks / 100计算占比,分母取值完全错误。 - 冗余代码:代码中定义的
tHlists列表仅做追加操作,全程没有被读取调用,属于无效代码,会无意义占用内存。
修正后代码
import random total_experiments = 10000 flip_count_per_experiment = 100 target_streak_length = 6 # 统计至少出现1次目标长度连续序列的实验数 streak_experiment_count = 0 for _ in range(total_experiments): current_streak = 1 last_result = random.randint(0, 1) found_streak = False for _ in range(flip_count_per_experiment - 1): current_result = random.randint(0, 1) if current_result == last_result: current_streak += 1 if current_streak == target_streak_length: found_streak = True break else: current_streak = 1 last_result = current_result if found_streak: streak_experiment_count += 1 streak_probability = streak_experiment_count / total_experiments * 100 print('Chance of streak: %s%%' % streak_probability)
修正后代码运行结果稳定在80%左右,符合该实验的数学概率预期。
内容的提问来源于stack exchange,提问作者Fquak
相关产品推荐
相关产品推荐

