我想从概率分布中生成10亿个随机点,并使用这些点计算函数来计算蒙特卡罗积分。问题是我使用的是MATLAB,对其他编程语言知之甚少。 MATLAB当然非常慢,我已经讨论了通过计算10个不同过程中1亿个点的值来并行化集成的可能性。这是一种可行的方法吗?如果是这样,实施它的最佳方法是什么?
目前的方法如下:
对于i:N
从分布中生成随机数
评估功能
将功能评估添加到临时变量
端
将临时变量除以N,因此积分已近似。
评估的功能如下:
如果生成的点小于数字B,则为0
如果生成的点大于或等于B,则点与B之间的差异。
使用@ Arpi的方法将改为使用parfor循环。
答案 0 :(得分:1)
这似乎比首次建议的 much, much simpler 。通过咨询wikipedia,可以通过分析解决问题。但是 - 我强调这不是正确的方法 - 因为这是一个编程站点,这是一个程序:
b = 0.3;
N = 1e9;
batch_size = 1e8;
total = 0;
for ii=1:(N/batch_size)
total = sum(max(0,rand(batch_size,1)-b));
end
result = total/N;
这需要大约15秒才能运行。如果更好地选择批量大小,可能会更快。
请注意,此处的“分布”在[0, 1)
区间是统一的,这可能不是所需的,但该方法可以扩展为适用于任何分布类型(其中许多是在Matlab中内置的)