NetLogo使用排序列表按索引取值提示元素不存在问题排查
问题根源
- NetLogo的列表索引是从0开始计数的,你创建了3个personer对象,排序后的
allehøjder列表长度为3,合法索引仅为0、1、2,你代码里用item 3访问自然会触发索引越界报错。 - 除此之外你的代码还有多处逻辑错误:
- 最小值取值错误:你用
item 1 (sort allehøjder)取最小值,实际排序后第一个元素(最小值)对应的索引是0 - 硬编码人数:所有计算逻辑里都写死了数值3,后续如果调整生成的personer数量,所有相关代码都要修改,建议用
length allehøjder动态获取列表长度 - 运算优先级错误:中位数计算里的
(3 + 1 / 2)没有正确加括号,NetLogo会优先计算除法,最终得到3.5的非整数索引,无法正常访问列表元素 - 中位数逻辑写反:当前ifelse的判断条件是
长度 mod 2 = 0,满足时为偶数长度,走第一个代码块,但你第一个代码块的计算逻辑是奇数长度的中位数计算方式,第二个代码块反而用了偶数长度的取两个相邻值求平均的逻辑,完全颠倒。
- 最小值取值错误:你用
修正后的核心代码片段
; 先把排序后的列表存下来,避免重复排序浪费性能 let sorteret_højder sort allehøjder let n length sorteret_højder ; 取最小值 set min_højde item 0 sorteret_højder ; 取最大值 set max_højde item (n - 1) sorteret_højder ; 计算中位数 ifelse n mod 2 = 0 [ ; 偶数长度:取中间两个数的平均值 let mid1 item ((n / 2) - 1) sorteret_højder let mid2 item (n / 2) sorteret_højder set median_højde (mid1 + mid2) / 2 ] [ ; 奇数长度:取中间的数 set median_højde item ((n - 1) / 2) sorteret_højder ]
内容的提问来源于stack exchange,提问作者Morten
相关产品推荐
相关产品推荐

