在Netlogo中是否有更有效的方法生成随机二项式数?
目前,我的模型正在使用以下代码片段生成随机二项式数,实际上是lynchpin使整个过程正常工作,并且被称为最频繁的代码:在Netlogo中是否有更有效的方法生成随机二项式数?,netlogo,Netlogo,目前,我的模型正在使用以下代码片段生成随机二项式数,实际上是lynchpin使整个过程正常工作,并且被称为最频繁的代码: to-report random-binomial [n p] report sum n-values n [ifelse-value (p > random-float 1) [1] [0]] end 但是,如果n变得非常大(例如10000000),此函数不会很快运行。基于一个旧线程,我正在尝试一个可能更有效的解决方案: to-report random-bi
to-report random-binomial [n p]
report sum n-values n [ifelse-value (p > random-float 1) [1] [0]]
end
但是,如果n变得非常大(例如10000000),此函数不会很快运行。基于一个旧线程,我正在尝试一个可能更有效的解决方案:
to-report random-binomial [n p]
report length filter [i -> i < p] n-values n [random-float 1]
end
报告随机二项[NP]
报告长度过滤器[i->i
自然地,由于这种情况的发生频率,任何小的减速都会在模型的其余部分滚雪球。有没有人知道更好的方法来执行这种计算,特别是当n变得非常大时?一般来说,这样的问题(如何有效地实现一个已知的函数)的答案是在数值方法文献中寻找一种经过验证的真实算法。经典的参考是“C中的数字配方”。我相信稍加搜索就会找到一种方法(例如,何时以及如何使用正态分布作为近似值)。一般来说,这样的问题(如何有效地实现一个众所周知的函数)的答案是在数值方法文献中寻找一种经过验证的真实算法。经典的参考是“C中的数字配方”。我相信只要稍加搜索就会找到一种方法(例如,何时以及如何使用正态分布作为近似值)。做大量愚蠢的事情总是很昂贵的。在应用程序中使用精确的二项分布是否至关重要?除非你的成功概率非常小,否则大多数人都会在低于1000万的样本量下转换为正态分布。我们在实验室里仔细考虑了这个问题,得出了类似的结论,正态分布或仅使用p作为比例可能是有效解决此问题的唯一方法。我认为这不是NetLogo的问题,但如果您认为NetLogo在大量随机抽取时的效率低于(比如)R,则可以使用R扩展来进行二项抽取。然而,我刚刚做了一次1亿次的50%测试,你的NetLogo代码和R中的sum(rbinom(100000000,1.5))之间的任何差异都很小,所以R扩展的开销可能不值得。做大量愚蠢的事情总是很昂贵的。在应用程序中使用精确的二项分布是否至关重要?除非你的成功概率非常小,否则大多数人都会在低于1000万的样本量下转换为正态分布。我们在实验室里仔细考虑了这个问题,得出了类似的结论,正态分布或仅使用p作为比例可能是有效解决此问题的唯一方法。我认为这不是NetLogo的问题,但如果您认为NetLogo在大量随机抽取时的效率低于(比如)R,则可以使用R扩展来进行二项抽取。然而,我刚刚做了一次1亿次的50%测试,你的NetLogo代码和R中的
sum(rbinom(100000000,1.5))
之间的任何差异都很小,因此R扩展的开销可能不值得