【问题标题】:NetLogo: getting randomly chosen position of a repeated value in a listNetLogo:随机选择列表中重复值的位置
【发布时间】:2023-02-02 23:56:05
【问题描述】:

如果我有以下内容:set list [8 1 0 3 4 2 0 1 2 4 25 0 3 3]。我想找到一种方法来获得零(2、6 或 11)或三(3、12 或 13)的随机项目位置。

我试过:

let i (position (one-of list = 0) list )
print i

但是,这只会返回一个布尔值 i。我知道我可以使用position 0 list,但它优先考虑第一个位置(2,在零的情况下),而我希望它从列表中所有等于零的值中随机选择。我想到了使用while[],但我想知道是否有更快更简单的方法。

【问题讨论】:

  • NetLogo 没有单独的程序让您检索您正在查找的项目在列表中的所有位置。您必须自己制作,即按照您所说的那样使用while或等效策略。
  • 谢谢@Matteo,我认为没有程序可以做那样的事情,只是想确定一下。最后,我可以设法用 while 完成一些事情。

标签: netlogo


【解决方案1】:

通常,当您使用列表时,最好熟悉 anonymous procedures 和一些相关的原语,如 mapfilter

我写了一个名为positions 的快速程序,它应该能够处理这个问题。首先,我创建了一个包含所有可能索引的列表:index-list。 接下来,我使用map 同时通过input-listindex-list。它使用ifelse-value 来检查input-list 的每一项是否对应于您要检查的input-item。如果它们对应,则返回该项目在输入列表中的位置。否则返回 FALSE。 最后一步是 filter 排除所有错误的回答,这样你就得到一个列表,只包含你的 input-iteminput-list 中的位置。

to-report positions [ input-item input-list ]
  
  let index-list range length input-list
  
  let position-list (map [ [list-item index] -> ifelse-value input-item = list-item [index][FALSE] ] input-list index-list)
  
  report filter [index -> index != FALSE] position-list

end

测试结果为 [2 6 11],这符合您的预期

to test

  let my-list [8 1 0 3 4 2 0 1 2 4 25 0 3 3]
  
  show positions 0 my-list ;[2 6 11]
  
end

【讨论】:

    猜你喜欢
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多