我有一些变量,可以通过+ 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
Run Code Online (Sandbox Code Playgroud)
目前我必须通过以下方式检查幼龟的X是否总是在范围内:
if X > 1 [set X X - 0.2]
if X < 0 [set X X + 0.2]
Run Code Online (Sandbox Code Playgroud)
什么是更好的方法呢?
如果我必须使用随机正常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
Run Code Online (Sandbox Code Playgroud)
输出是100万次中的*67次时间*67是我得到的最大值,我得到58,51,......
正如您所发现的,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) ]
Run Code Online (Sandbox Code Playgroud)

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 ]
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是问自己是否真的需要钟形曲线,或者三角形分布是否合适.只需将两次调用相加,就可以非常简单地得到三角形的结果分布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 ]
Run Code Online (Sandbox Code Playgroud)

我最喜欢的技巧是这样的:
set x median (list 0 (y) 1)
Run Code Online (Sandbox Code Playgroud)
哪里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
Run Code Online (Sandbox Code Playgroud)