Python for循环预期生成10元素列表 实际返回元素数随机问题
抛硬币练习代码长度异常问题
问题背景
我正在完成《Automate the Boring Stuff》课程中的抛硬币挑战任务,需要计算100组试验中出现连续6次正面(H)或连续6次反面(T)序列的概率。我的实现思路分为两步:
- 第一步:生成每个元素为H或T的抛硬币结果列表
- 第二步:在列表中检索连续6次的同面序列
作为Python编程初学者,我习惯在完成正式挑战前先编写练习小程序,用后续正式程序会用到的概念做验证,编写的练习代码如下:
import random Heads=0 Tails=0 exper=[] for i in range(10): if random.randint(0, 1)==0: exper.append('H') Heads=Heads + 1 if random.randint(0, 1)==1: exper.append('T') Tails = Tails + 1 print (exper) print (Heads) print(Tails)
我预期输出长度为10的H/T列表,示例如下:
['H','T','H','T','H','T','H','T','H','T']
但实际运行时输出的列表虽仅包含H、T两类元素,长度却是随机的:有时仅2个元素,有时为10个,甚至会出现14个元素的情况,找不到代码错误位置。
错误原因
核心问题是你在单次循环里调用了两次独立的随机数生成函数,且用了两个平级的if判断,没有做互斥处理:
- 第一次生成的随机数如果是0,会追加H、正面计数+1,但代码会继续执行第二个
if判断,重新生成一个新的随机数 - 如果第二个新随机数刚好是1,就会再追加一个T、反面计数+1,这一轮循环就加了2个元素
- 如果第一次随机数是1、第二次随机数是0,两个判断条件都不满足,这一轮循环不会追加任何元素
- 只有两次随机结果刚好匹配对应判断条件时,单轮循环才会恰好追加1个元素,最终列表长度完全随机。
修正代码
把两个平级if改成互斥的if/else结构,每轮循环只生成一次随机数,保证每次循环恰好追加1个元素即可:
import random Heads = 0 Tails = 0 exper = [] for i in range(10): # 每轮循环只生成一次随机结果,避免重复随机 flip_res = random.randint(0, 1) if flip_res == 0: exper.append('H') Heads += 1 else: exper.append('T') Tails += 1 print(exper) print(Heads) print(Tails)
修正后运行代码,输出的结果列表长度固定为10,正反面计数之和永远等于10,符合预期。
内容的提问来源于stack exchange,提问作者dadagario
相关产品推荐
相关产品推荐

