NetLogo:如何确保变量保持在定义的范围内?

时间:2013-11-27 00:20:58

标签: netlogo

我有一些变量可以通过+ 0.1和-0.1的变化继承给子代理,或者没有任何更改,或者是随机的,我做的是这样的:(代码只是一个例子)< / p>

to reproduce
  ask turtle 1
  [
  let X-Of-Mother X

  hatch 1
  [

    set X one-of (list (X-Of-Mother) (X-Of-Mother + 0.1) (X-Of-Mother - 0.1) (random-float 1))

    ]

  ]

end

目前,我必须检查儿童乌龟的X是否总是在范围内,如下所示:

if X > 1 [set X X - 0.2]
if X < 0 [set X X + 0.2]

什么是更好的方法呢?

如果我必须使用随机正常0.5 0.1,如何将其限制为0到1之间的值,我已经做了很多重复生成这样的随机数我认为随机正常的质量是好的并且有不是很多次,我需要检查它是否超出范围。

例如:

  to test 
    Let c 0
    let b 0 
    repeat 100000000
    [Set b random-normal 0.5 0.1
      if b > 1 [set C C + 1]
      If b < 0 [set C C + 1]

      ]
    print c  

  end

OUTPUT是* 67 超过100000000时间 * 67是我得到的最大的一个,我得到58,51,......

3 个答案:

答案 0 :(得分:8)

正如您所发现的那样,random-normal可能会有问题,因为您获得的结果可能是任何数字。

一种可能的解决方案是将random-normal的输出钳位在边界内,如Matt的答案。请注意,此方法会在范围的边界处创建尖峰:

observer> clear-plot set-plot-pen-interval 0.01 set-plot-x-range -0.1 1.1
observer> histogram n-values 1000000 [ median (list 0 (random-normal 0.5 0.2) 1) ]

enter image description here

Marzy在问题本身中描述的另一个可能的解决方案是丢弃任何越界结果random-normal给你并且只是再次尝试,直到你得到一个入境结果。这避免了边界的尖峰:

to-report random-normal-in-bounds [mid dev mmin mmax]
  let result random-normal mid dev
  if result < mmin or result > mmax
    [ report random-normal-in-bounds mid dev mmin mmax ]
  report result
end

observer> clear-plot set-plot-pen-interval 0.01 set-plot-x-range -0.1 1.1
observer> histogram n-values 1000000 [ random-normal-in-bounds 0.5 0.2 0 1 ]

enter image description here

另一个解决方案是问自己是否真的需要钟形曲线,或者三角形分布是否合适。只需将两次调用总和到random-float

,就可以非常简单地得到三角形的结果分布
observer> clear-plot set-plot-pen-interval 0.01 set-plot-x-range 0 1
observer> histogram n-values 10000000 [ 0.5 + random-float 0.5 - random-float 0.5 ]

histogram

答案 1 :(得分:4)

我最喜欢的诀窍是:

set x median (list 0 (y) 1)

y是随机数(或表达式),0是最小值,1是最大值。

它有效,因为如果y大于1,则中位数为1。如果y小于0,则中位数将为0。否则中位数为y

例如,以下是示例中的随机数,其范围为[0,1]:

 to test
    let b median (list 0 (random-normal 0.5 0.1) 1)
    print b
 end

答案 2 :(得分:1)

很迟才答应为将来的求职者添加另一个选择...

另一种选择是,如果您正在寻找一个像正态分布一样呈钟形但有界的分布,则Beta分布可能是一个不错的选择。如果您使用3,3或4,4之类的参数,它看起来很像正态分布,但不会有任何界外值(它的范围是从0到1,因此可能必须移动/像通常一样缩放)。

Netlogo没有内置的Beta,但是您可以从内置的gamma两次绘图中获得它,如下所示:

to-report random-beta [ #shape1 #shape2 ]

  let Xa random-gamma #shape1 1
  let Xb random-gamma #shape2 1
  report Xa / (Xa + Xb)

end

有关数学的更多详细信息,请参见:https://math.stackexchange.com/questions/190670/how-exactly-are-the-beta-and-gamma-distributions-related