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

离散数学概率模拟:盒状态代码重置错误及条件概率求解咨询

问题描述

袋中有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 08:35:01