Netlogo 为给定的长度制作一个列表

Netlogo making a list out of itself for a given length

我想根据给定长度的自己的值创建一个列表。

例如,给定列表 [0 1] 和所需的列表长度 7,输出将为 [0 1 0 1 0 1 0]。长度由 population 定义,并由滑块定义。我声明了应该遍历列表的变量 x 。如果列表的长度小于 population 的值,则应再次将其设置为 0

我用循环命令试过了,但它无限运行:

let x 0
  loop[
    if length exp-dif-li <= population[
      ifelse x < length exp-dif-li[
        set x 0]
      [ set exp-dif-li lput item x exp-dif-li exp-dif-li
        set x x + 1]
    ]
  ]
]

mod and n-values 是你的朋友吗:

to-report continue-list [ lst n ]
  report n-values n [ item (? mod length lst) lst ]
end

示例使用:

observer> show continue-list [0 1] 7
observer: [0 1 0 1 0 1 0]
observer> show continue-list [0 1] 1
observer: [0]
observer> show continue-list [0 1 2 3 4] 22
observer: [0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1]

编辑:意识到讨论为什么这有效会很好! n-values n [ ... ] 通过将数字 0n - 1 发送给给定的报告者来创建长度为 n 的列表。记者使用 ? 访问号码(这是 NetLogo task 语法)。所以我们要不断重复原始列表中的项目。重复循环数字的一个非常好的函数是 mod。一般来说,新列表的i项应该是i mod <length of original list>项。因此,将它们放在一起,n-values n [ item (? mod length lst) lst ] 通过根据需要重复列表 lst 中的项目来创建一个长度为 n 的新列表。

要退出循环,您需要调用结束或停止。

插入行

if length exp-dif-li = 7 [stop]

正确的地方会做。循环很容易变成无限循环和冻结,所以最好避免。

我更喜欢 while 循环。它们更安全,更不容易出现像这样的无限循环

while length exp-dif-li < 7
  [
   if length exp-dif-li <= population[
  ifelse x < length exp-dif-li[
    set x 0]
  [ set exp-dif-li lput item x exp-dif-li exp-dif-li
    set x x + 1]
  ]  

Netlogo 有另一种我在其他地方没有见过的方法,它对无限循环非常有效。 [重复] 你的用法似乎是

  repeat 7  [
            if length exp-dif-li <= population[
             ifelse x < length exp-dif-li[set x 0]
             [ set exp-dif-li lput item x exp-dif-li exp-dif-li
            set x x + 1]
            ]