首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NetLogo :如何确保变量保持在定义的范围内?

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

Stack Overflow用户
提问于 2013-11-27 08:20:58
回答 3查看 4.2K关注 0票数 6

我有几个变量可以通过+ 0.1和-0.1的变化继承到子代理,或者不需要任何更改,或者是随机的,我所做的如下所示:(代码只是一个示例)

代码语言:javascript
复制
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是否总是在范围内,如下所示:

代码语言:javascript
复制
if X > 1 [set X X - 0.2]
if X < 0 [set X X + 0.2]

有什么更好的方法可以做到这一点?

如果我必须使用random-normal 0.5 0.1,我如何才能将其限制在0到1之间的值,我已经多次重复生成这样的随机数,我认为random-normal的质量很好,没有那么多次我需要检查它是否超出范围。

例如:

代码语言:javascript
复制
  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

的输出是100000000次中的*67次* 67是我得到的最大的,我得到了58,51,...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-27 12:20:08

正如您已经发现的,random-normal可能会有问题,因为您返回的结果可能是任何数字。

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

代码语言:javascript
复制
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) ]

另一种可能的解决方案,正如马奇在问题本身中所描述的那样,是丢弃random-normal给你的任何超出范围的结果,并继续尝试,直到你得到一个范围内的结果。这避免了边界上的尖峰:

代码语言:javascript
复制
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 ]

另一种解决方案是问问自己,你是否真的需要钟形曲线,或者三角形分布是否就足够了。只需将对random-float的两次调用相加,就可以非常简单地得到三角形的结果分布

代码语言:javascript
复制
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 ]

票数 9
EN

Stack Overflow用户

发布于 2013-11-27 09:24:27

我最喜欢的小把戏是:

代码语言:javascript
复制
set x median (list 0 (y) 1)

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

它之所以有效,是因为如果y大于1,那么中位数将是1。如果y小于0,则中位数将为0。否则,中位数是y

例如,下面是您的示例中限制在0,1范围内的随机数

代码语言:javascript
复制
 to test
    let b median (list 0 (random-normal 0.5 0.1) 1)
    print b
 end
票数 6
EN

Stack Overflow用户

发布于 2018-12-05 04:01:03

回答得很晚,为未来的搜索者增加了另一个选择...

如果您正在寻找像正态分布一样呈钟形但有界的分布,则Beta分布可能是一个很好的选择。如果你使用像3,3或4,4这样的参数,它看起来很像正态分布,但不会有任何越界的值(它从0缩放到1,所以它可能必须像正态分布一样移动/缩放)。

Netlogo没有内置的Beta,但你可以从内置的gamma中提取两次,如下所示:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20230685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档