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

List Netlogo为给定长度制作一个列表,list,netlogo,List,Netlogo,我想用给定长度的列表自身的值创建一个列表 例如,给定列表[01]和所需的列表长度7,输出将是[01 01 01 0]。长度由填充定义,并由滑块定义。我声明了应该遍历列表的变量x。如果列表的长度小于总体的值,则应再次将其设置为0 我用循环命令尝试了它,但它运行无限: let x 0 loop[ if length exp-dif-li <= population[ ifelse x < length exp-dif-li[ set x 0]

我想用给定长度的列表自身的值创建一个列表

例如,给定列表
[01]
和所需的列表长度7,输出将是
[01 01 01 0]
。长度由
填充定义,并由滑块定义。我声明了应该遍历列表的变量
x
。如果列表的长度小于
总体
的值,则应再次将其设置为
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]
    ]
  ]
]
设x0
环路[
如果长度exp dif li和您是这里的朋友:

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[…]
通过
n-1
将数字
0
发送给给定的报告者,创建一个长度
n
的列表。报告者使用
访问数字(这是NetLogo语法)。因此,我们希望继续重复原始列表中的项目。重复循环数字的一个非常好的函数是
mod
。一般来说,新列表中的项目
i
应该是项目
i mod
。因此,把它们放在一起,
n值n[item(?.mod length lst)lst]
根据需要重复列表
lst
中的项目,创建长度
n
的新列表。

要摆脱循环,需要调用end或stop

插入行

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]
  ]  
而长度exp dif li<7
[

如果有人希望列表随机化,那么可以在report和n值之间使用shuffle命令
  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]
            ]