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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:45:31