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
相关产品推荐
相关产品推荐

