You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 10:57:19