random.choice相关问题:多实验循环下分球入箱模拟结果异常
问题分析
你的代码出现异常的核心原因有两个:
- 未重置实验环境:
bins列表在实验循环外初始化,所有实验共用同一组箱子,后续实验会在之前实验已有球的箱子里继续添加,导致数据累积,结果完全不符合独立实验的预期。 - 引用复用问题:
bins_new.append(bins)添加的是bins的内存引用而非副本,最终bins_new里的所有元素都指向同一个bins对象,所有实验结果都会变成最后一次实验的状态。
另外还有两个可优化的细节:
random.choices(bins[pack], k=1)返回的是长度为1的列表,直接取selected[0]比用min更高效(虽然k=1时结果一致,但逻辑更清晰)。- 用
np.ones创建球的列表完全没必要,你只需要控制分球次数,直接用循环次数即可,不需要实际存储球对象。
修正后的代码
import random import numpy as np bins_balls = [10,20,30,40,50] num_exp = 15 bins_new = [] for exp in range(num_exp): random.seed(exp + 1) # 每次实验重新初始化箱子,保证实验独立 current_bins = [] for count in bins_balls: # 创建对应数量的空箱子 bin_list = [[] for _ in range(count)] current_bins.append(bin_list) # 分球:count个球,每个球随机选一个箱子放入 for _ in range(count): selected = random.choices(bin_list, k=1)[0] selected.append(1) # 用1代表球,无需存储numpy数组 bins_new.append(current_bins)
关键修改说明
- 将箱子初始化移到实验循环内部,每次实验都创建全新的空箱子,确保实验之间完全独立,不会互相干扰。
- 移除冗余的
balls列表,直接用range(count)控制分球次数,简化代码逻辑。 - 调整
selected的取值方式,直接取random.choices返回列表的第一个元素,逻辑更直观。 bins_new.append(current_bins)添加的是每次实验独立创建的箱子列表,避免了引用复用导致的结果异常。
内容的提问来源于stack exchange,提问作者Farmanli
相关产品推荐
相关产品推荐

