由于我不精通数学,我正在努力在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
的事实。
有人可以帮忙吗?
答案 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
获得一个