Julia无放回抽样函数报错修复:BoundsError索引越界问题
修复无放回抽样Julia函数的BoundsError问题
错误原因
你遇到的BoundsError是因为代码错误修改了概率数组p的长度:每次抽样后,你将p替换为仅包含剩余元素的短数组,但disponible列表存储的仍是原始向量的索引(比如5)。当用这些原始索引去访问缩短后的p数组时,自然会触发索引越界——短数组的最大索引远小于原始索引值。
修复后的代码
function sin_reemplazo(p, n) if !(isa(p, Vector) && isa(n, Int) && n > 0 && n ≤ length(p)) @error "p debe ser un vector, n un entero positivo y n menor que la longitud del vector p" return nothing end # 归一化原始概率,避免修改输入参数 p_normalized = p ./ sum(p) @warn "Los valores del vector p fueron forzados a sumar 1" muestra = Int[] # 明确类型提升性能 available_indices = collect(1:length(p_normalized)) for _ in 1:n # 提取当前可用元素的概率并重新归一化 current_probs = p_normalized[available_indices] current_probs ./= sum(current_probs) u = rand() cum_sum = 0.0 selected_pos = 0 # 遍历当前可用概率数组,找到选中位置 for (idx, prob) in enumerate(current_probs) cum_sum += prob if u ≤ cum_sum selected_pos = idx break end end # 映射回原始索引并加入结果 selected_original_idx = available_indices[selected_pos] push!(muestra, selected_original_idx) # 从可用列表中移除选中元素 deleteat!(available_indices, selected_pos) end return ("muestra sin reemplazo: ", muestra) end
核心修复点
- 保留原始概率数组:不再修改
p的长度,始终用原始索引访问归一化后的p_normalized,避免索引不匹配 - 动态计算当前概率:每次循环基于
available_indices提取对应概率子集,重新归一化后用于抽样 - 遍历子集索引:直接遍历当前概率子集的位置,而非原始索引,彻底规避越界风险
- 明确数组类型:将结果数组声明为
Int[],提升代码性能与类型安全性
内容的提问来源于stack exchange,提问作者victhor99
相关产品推荐
相关产品推荐

