我有几个变量可以通过+ 0.1和-0.1的变化继承到子代理,或者不需要任何更改,或者是随机的,我所做的如下所示:(代码只是一个示例)
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]
有什么更好的方法可以做到这一点?
如果我必须使用random-normal 0.5 0.1,我如何才能将其限制在0到1之间的值,我已经多次重复生成这样的随机数,我认为random-normal的质量很好,没有那么多次我需要检查它是否超出范围。
例如:
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,...
发布于 2013-11-27 12:20:08
正如您已经发现的,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) ]
另一种可能的解决方案,正如马奇在问题本身中所描述的那样,是丢弃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 ]
另一种解决方案是问问自己,你是否真的需要钟形曲线,或者三角形分布是否就足够了。只需将对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 ]
发布于 2013-11-27 09:24:27
我最喜欢的小把戏是:
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
发布于 2018-12-05 04:01:03
回答得很晚,为未来的搜索者增加了另一个选择...
如果您正在寻找像正态分布一样呈钟形但有界的分布,则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
https://stackoverflow.com/questions/20230685
复制相似问题