假设我有 X 个补丁,并且补丁有一个名为“补丁质量”的补丁变量,其值介于 0 和 1 之间。我想按照正态分布为该变量生成一个介于 0 和 1 之间的随机数。
当你在NetLogo中设置正态分布时,你需要一个均值和一个标准差:
random-normal mean standard-deviation
我的正态分布的平均值是 0.5(0 和 1 的平均值),但是有没有办法选择一个标准偏差,这样 NetLogo 就不会生成补丁质量低于 0 和高于 1 的补丁?
总而言之,我想要的是一个正态分布,其中patch-quality的最小值为0,最大值为1,平均值为0.5。
这可能吗?
正态分布函数的签名永远不存在,因为这不是它们在概念上的使用方式。然而,高于或低于平均值超过标准偏差 3 倍的值很少发生。通过将平均值设置为 0.5 并将标准偏差设置为 +- 0.15,高于 1 或低于 0 的数字应该不会出现太多。如果你想加强这一点,你可以简单地添加另一行代码:
ask patches with [number < 0] [set number 0]
>1 个案例也是如此。这应该接近你的要求。
这是 ABM 中的一个真正问题,因此我们在本书(第 15.3.2 节) 中解决了它。尽管高于和低于 3 个标准偏差的值很少见......我们经常绘制成千上万的值,因此它们将发生。
上一个答案的解决方案有效,我用了很多年。请注意,现在您的值不会真正遵循正态分布。
我也经常改用三角分布。从三角分布中抽取的所有值都在指定范围内,并且靠近中心的值更有可能。它还有一个额外的优点,即最可能的值(众数)不必位于范围的中心。
这是我使用的三角分布程序(从维基百科偷来的算法):
to-report random-triangular [a-min a-mode a-max]
; Return a random value from a triangular distribution
; Method from https://en.wikipedia.org/wiki/Triangular_distribution#Generating_Triangular-distributed_random_variates
; Obtained 2015-11-27
if (a-min > a-mode) or (a-mode > a-max) or (a-min >= a-max)
[ error (word "Random-triangular received illegal parameters (min, mode, max): " a-min " " a-mode " " a-max) ]
let a-rand random-float 1.0
let F (a-mode - a-min) / (a-max - a-min)
ifelse a-rand < F
[ report a-min + sqrt (a-rand * (a-max - a-min) * (a-mode - a-min)) ]
[ report a-max - sqrt ((1 - a-rand) * (a-max - a-min) * (a-max - a-mode)) ]
end
史蒂夫·雷尔斯巴克