离散数学概率模拟:盒状态代码重置错误及条件概率求解咨询
问题描述
袋中有1、2、3、4号数字卡片,每次抽取后放回,共执行4次抽取操作:
- 抽1号卡片:向box_b中添加1个白球(标记为0)
- 抽2或3号卡片:向box_b中添加1个白球和1个黑球(标记为1)
- 抽4号卡片:向box_b中添加2个白球和1个黑球
需求:当box_b中共有8个球时,求其中黑球数为2的概率。
代码问题
现有如下Python模拟代码,运行后输出的是累积的长列表,而非每次4次抽取组合对应的box_b状态列表。已知需要在i、j、k、l变化时重置box_b,但不确定重置位置:
import math # 흰공=0 검은공=1 box_b = list() # 조건부확률 = box_b 원소 개수 8개(=e)이면서 1이 2개(=f)일 확률 / e 확률 cnt_e = 0 cnt_ef = 0 for i in range(1, 5) : if i == 1 : box_b.append(0) if i == 2 or i == 3 : box_b.append([0, 1]) if i == 4 : box_b.append([0, 0, 1]) for j in range(1, 5) : if j == 1 : box_b.append(0) if j == 2 or j == 3 : box_b.append([0, 1]) if j == 4 : box_b.append([0, 0, 1]) for k in range(1, 5) : if k == 1 : box_b.append(0) if k == 2 or k == 3 : box_b.append([0, 1]) if k == 4 : box_b.append([0, 0, 1]) for l in range(1, 5) : if l == 1 : box_b.append(0) if l == 2 or l == 3 : box_b.append([0, 1]) if l == 4 : box_b.append([0, 0, 1]) print(box_b)
期望输出为每次4次抽取对应的状态列表(如[0, [0,1], [0,0,1], [0,1]]),但实际输出是累积的长列表,需修正代码的box_b重置逻辑。
修正方案
问题核心是每次循环层级开始前都要创建独立的列表副本,避免在原有列表上追加元素导致累积。正确的处理方式是每个循环层级基于上层结果复制新列表,确保每次4次抽取的状态独立:
import math # 조건부확률 = box_b 원소 개수 8개(=e)이면서 1이 2개(=f)일 확률 / e 확률 cnt_e = 0 cnt_ef = 0 for i in range(1, 5): # 第一次抽取前初始化空列表 box_b = [] if i == 1: box_b.append(0) elif i == 2 or i == 3: box_b.append([0, 1]) elif i == 4: box_b.append([0, 0, 1]) for j in range(1, 5): # 复制i层的列表,避免修改原数据 box_j = box_b.copy() if j == 1: box_j.append(0) elif j == 2 or j == 3: box_j.append([0, 1]) elif j == 4: box_j.append([0, 0, 1]) for k in range(1, 5): # 复制j层的列表 box_k = box_j.copy() if k == 1: box_k.append(0) elif k == 2 or k == 3: box_k.append([0, 1]) elif k == 4: box_k.append([0, 0, 1]) for l in range(1, 5): # 复制k层的列表,得到当前4次抽取的独立状态 box_l = box_k.copy() if l == 1: box_l.append(0) elif l == 2 or l == 3: box_l.append([0, 1]) elif l == 4: box_l.append([0, 0, 1]) # 输出当前4次抽取的状态 print(box_l) # 统计符合条件的情况 total_balls = 0 black_balls = 0 for item in box_l: if isinstance(item, list): total_balls += len(item) black_balls += item.count(1) else: total_balls += 1 if total_balls == 8: cnt_e += 1 if black_balls == 2: cnt_ef += 1 # 计算并输出条件概率 if cnt_e > 0: probability = cnt_ef / cnt_e print(f"条件概率为: {probability}") else: print("没有符合总球数为8的情况")
修正说明
- 每个循环层级都创建列表副本,彻底避免了累积问题,确保每次输出的都是4次抽取的独立状态
- 将原代码的多
if改为elif,逻辑更严谨,避免触发多个分支 - 新增了统计逻辑,直接计算题目要求的条件概率
内容的提问来源于stack exchange,提问作者jinee
相关产品推荐
相关产品推荐

