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

Python模拟n球入n盒统计空盒数:代码运行异常求助

问题分析与修复方案

原代码的核心问题

  • 函数内部错误嵌套了递归调用list(combinations_with_replacement_counts(10, 10)),导致生成器逻辑完全混乱,无法正常生成结果。
  • 你用itertools.combinations枚举所有放球的组合,这是枚举所有可能的分配情况,不是题目要求的10000次随机模拟,方向完全错了。
  • 直接打印生成器对象a只会输出内存地址,不会遍历生成器内容。

正确的随机模拟实现代码

下面是符合需求的代码,用随机数模拟放球过程,重复10000次并统计结果:

import random
from collections import defaultdict

def simulate_balls_in_boxes(n, trials):
    # 存储不同空盒数量的出现次数
    empty_box_counts = defaultdict(int)
    
    for _ in range(trials):
        # 每个球随机选一个盒子(编号0到n-1)
        box_assignments = [random.randint(0, n-1) for _ in range(n)]
        # 统计每个盒子的球数
        ball_count = [0] * n
        for box in box_assignments:
            ball_count[box] += 1
        # 统计空盒数量(球数为0的盒子数)
        empty_num = sum(1 for count in ball_count if count == 0)
        # 更新计数
        empty_box_counts[empty_num] += 1
    
    return empty_box_counts

# 运行模拟:n=10,10000次试验
result = simulate_balls_in_boxes(10, 10000)

# 输出结果,按空盒数量排序
for empty_num in sorted(result.keys()):
    print(f"空盒数量{empty_num}:出现{result[empty_num]}次")

代码说明

  • 用random.randint模拟每个球随机放入一个盒子,符合真实的随机放球场景。
  • 用defaultdict统计不同空盒数的出现次数,方便高效。
  • 每次模拟后统计空盒数量,累计到结果字典中,最后按空盒数排序输出。

原代码的小修正(如果只是想枚举所有组合)

如果你原本是想枚举n个球放n个盒子的所有可能分配情况(不是随机模拟),那原代码需要修正递归调用的位置,正确遍历生成器:

import itertools, operator

def combinations_with_replacement_counts(n, r):  
    size = n + r - 1
    for indices in itertools.combinations(range(size), n): 
        starts = [0] + [index+1 for index in indices]
        stops = indices + (size,)
        yield tuple(map(operator.sub, stops, starts))

# 遍历生成器并打印所有结果
for combo in combinations_with_replacement_counts(10, 10):
    print(combo)

但注意:这个枚举的方式会生成大量结果(对于n=10,有C(19,10)=92378种),和你题目要求的10000次随机模拟完全是两回事。

内容的提问来源于stack exchange,提问作者Muhammet Ali CANŞI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:45:35