带有未设置全局变量的代码如何不返回 'nobody'?

How is code with an unset global variable not returning 'nobody'?

我有一个学生创建了一个名为 random-patch 的全局变量和一个名为 elevation 的补丁变量。然后他们使用海拔随机选择一个补丁来设置随机补丁。问题是代码是 运行 并且在没有设置补丁变量高程的情况下选择补丁。我知道它会自动设置为零,但这段代码通常不会有人提出来吗?如果您能帮助理解这里的问题,我们将不胜感激。

代码:

globals [ random-patch ]

patches-own [ elevation ]

to setup
  ca

  set random-patch one-of patches with [ elevation = (random 50) ]

;Also still reports a patch if only the pre to-setup code is entered and the
;following is entered on the interface observer console:

show one-of patches with [elevation = (random 50)]

这实际上是一个非常微妙的错误。它不是 returning nobody 的原因是因为它在从中选择之前构建代理集。它所做的是独立测试每个补丁并为每个补丁绘制一个随机整数。以下代码将这两个步骤分开。

globals [ random-patch ]

patches-own [ elevation ]

to setup
  clear-all
  let zeros patches with [ elevation = (random 50) ]
  type "Patches with zero: " print count zeros
  set random-patch one-of zeros  print random-patch
end

如果您使用的是标准设置,则有 1089 个补丁。 1/50 的随机抽取将 return 0,因此 1/50 或大约 22 个补丁将满足条件并位于隐式构建的补丁集中。

将原始代码中的 random 50 更改为 random 100000,您可能会得到 nobody。如果您分开抽奖,它也会按您预期的方式运行(所以 let roll random 50 然后 set random-patch one-of patches with [ elevation = roll ]