NetLogo:如何随机获取列表中重复值的对应位置?
解决NetLogo中随机获取列表指定值的匹配位置问题
首先纠正你之前代码的问题:one-of list = 0是在做布尔判断(检查列表里是否存在0),所以position实际是在找布尔值true/false在列表里的位置,自然只会返回布尔结果,完全偏离了你的需求。
要实现从所有匹配值的位置里随机选一个,不用写while循环,用NetLogo的内置高阶函数就能快速搞定,核心逻辑和代码如下:
核心实现思路
- 生成目标列表的所有索引(NetLogo列表索引从0开始)
- 筛选出那些索引对应的列表元素等于目标值的索引
- 从筛选出的索引列表里随机选取一个
直接使用的代码示例
set list [8 1 0 3 4 2 0 1 2 4 25 0 3 3] let target 0 ; 可替换为3或其他你需要查找的值 ; 获取所有匹配目标值的索引 let matching-positions filter [i -> item i list = target] range length list ; 随机选择一个位置 let random-pos one-of matching-positions print random-pos
封装成可复用的自定义过程
如果需要多次调用这个功能,建议封装成过程:
to-report random-position-of [target-value target-list] ; 生成目标列表的全部索引 let all-indices range length target-list ; 筛选出元素等于目标值的索引 let matched-indices filter [i -> item i target-list = target-value] all-indices ; 随机返回一个匹配的索引 report one-of matched-indices end ; 使用示例 set list [8 1 0 3 4 2 0 1 2 4 25 0 3 3] print random-position-of 0 list ; 随机输出2、6、11中的一个 print random-position-of 3 list ; 随机输出3、12、13中的一个
这个方法完全利用NetLogo内置函数完成需求,比手动写循环更简洁高效,不需要自己处理遍历逻辑。
内容的提问来源于stack exchange,提问作者Pol
相关产品推荐
相关产品推荐

