如何创建"随机 - 帕累托"在NetLogo?

时间:2015-02-04 09:12:04

标签: netlogo prng

由于我不精通数学,我正在努力在NetLogo中实现随机数生成器,该生成器大致遵循帕累托分布。这是此here的后续问题,我希望将random-float替换为"random-pareto",以便在帕累托分布之后在模型中发生事件(考虑模拟地震及其破坏程度)。

有问题的代码是:

  ask hits [
     let %draw (random-float 100)
     let %strength 0  ;; no damage
     if (%draw < 50) [set %strength (%strength + 1)]  ;;1 for little damage
     if (%draw < 10) [set %strength (%strength + 1)]  ;;2 for middle damage
     if (%draw < 5) [set %strength (%strength + 1)]  ;;3 for strong damage
     if (%draw < 1) [set %strength (%strength + 1)]  ;;4 for complete destruction

     ifelse pcolor = red [die]
     [ ask n-of %strength patches [ set pcolor red ]]
   ]

我受到这个问题here的启发,在R和Netlogo词典here中做同样的事情,关于random-exponential可以写成(- mean) * ln random-float 1.0的事实。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

您需要的是从均匀分布(随机浮动)转换为您想要的分布的等式。对于stackexchange统计信息,这可能是一个更好的问题。但是,根据维基百科的说法,公式是:

$$ T = \ frac {m} {U ^ \ frac {1} {\ alpha}} $$

其中$ U $是统一输入,$ T $是Pareto分布随机数,$ m $(最小值)和$ \ alpha $是分布的参数。如果这是正确的,您可以在NetLogo中编码为

to-report random-pareto [alpha mm]
  report mm / ( random-float 1 ^ (1 / alpha) )
end

假设您想要从分布中随机Pareto,最小值为1,alpha为3,那么您可以使用代码random-pareto 3 1获得一个