生成一个范围内的数字并考虑均值

Generate a number within a range and considering a mean val

我想在考虑平均值的同时生成一个范围内的随机数。

我有生成范围的解决方案:

turtles-own [age]

to setup
  crt 2 [
   get-age 
  ]     
end

to get-age
  let min-age 65
  let max-age 105
  set age ( min-age + random ( max-age - min-age ) )
end

但是,如果我使用这种方法,每个数字都可以以相同的概率创建,这在这种情况下没有多大意义,因为 65 岁的人比 105 岁的人多。 因此,我想包括一个平均值。我发现 random-normal 但由于我没有标准差并且我的值不是正态分布的,所以我不能使用 this 方法。

编辑:

举个例子:我有两种代理类型。代理类型 1 的平均年龄为 79 岁,年龄范围为 67-90 岁。代理类型 2 的平均年龄为 77 岁,年龄范围为 67-92 岁。

如果我如上所述在 NetLogo 中实现代理类型,则代理类型 1 的平均年龄为 78 岁,代理类型 2 的平均年龄为 79 岁。原因是每个年龄的数字完全相同生成代理。这最终为我的人工种群提供了错误的结果。


[编者注:此处添加提问者的评论。]

我想要一个值分布,其中最大值为最小值,最小值为最大值。然而,分布曲线不一定是负线性的。因此,我需要平均值。我需要这种方法,因为有可能一种代理类型的年龄范围为 65 - 90 岁,平均年龄为 70 岁,而另一种代理类型的年龄范围相同,但平均年龄为 75 岁。因此代理的实际年龄分布会看起来不一样。

这是一道数学题,而不是 NetLogo 题。您还没有弄清楚您希望分布是什么样的(许多不同的曲线可以具有相同的最小值、最大值和平均值)。如果你不知道你的曲线是什么样的,那么在 NetLogo 中编写它是相当困难的。

但是,让我们采用最简单的曲线。这是两种均匀分布,一种是从最小值到平均值,另一种是从平均值到最大值。虽然它不会沿长度减少,但它会给你最小值、最大值和你想要的平均值,只要平均值小于从最小值到最大值的中点(就像你的目标正在下降)。唯一的问题是从两个均匀分布中的每一个得到 select 的概率是多少。

如果 L 是你的最小值(低值),H 是你的最大值(高值),M 是平均值,那么你需要从较低的范围中找到 select 的概率 P,其中 (1 -P) 为上限。但是您知道较低范围的总概率必须等于较高范围的总概率必须等于 0.5,因为您想要在均值处切换范围,并且均值也必须是组合分布的均值。因此,每个矩形的大小都相同。即 P(M-L) = (1-P)(H-M)。解决 P 得到你:

P = (H-M) / (H - L)

将其放入一个函数中:

to-report random-tworange [#min #max #mean]
  let prob (#max - #mean) / (#max - #min)
  ifelse random-float 1 < prob
  [ report #min + random-float (#mean - #min) ]
  [ report #mean + random-float (#max - #mean) ]
end

要对此进行测试,请在以下代码中尝试不同的值:

to testme
  let testvals []
  let low 77
  let high 85
  let target 80
  repeat 10000 [set testvals lput (random-tworange low high target) testvals]
  print mean testvals
end

您还应该考虑另一件事 - 年龄有多重要?这是一个设计问题。你只需要包括改变代理行为的东西。如果 70 岁的代理人做出与 80 岁的代理人相同的决策,那么您真正需要的只是年龄在此范围内,而不是特定值。