关于算法:蒙特卡洛pi计算可以用于世界纪录吗?

Can a Monte Carlo pi calculation be used for a world record?

我有一个随机函数来计算pi-monte-carlo样式:

Enter image description here

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
max=10000000;
format long;

in = 0;
tic
for k=1:max
    x = rand();
    y = rand();
    if sqrt(x^2 + y^2) < 1
        in = in + 1;
    end
end

toc
calc_pi = 4*in/max
epsilon = abs(pi - calc_pi)

calcPi(100000000);

如果我能重复这个10e100次,这个算法能和世界纪录相媲美吗?如果是的话,我如何才能找到将给出第n个数字的迭代次数呢?


这是一个计算圆周率的很好的练习,但它可能是一个非常低效的练习。一些评论:

  • 我喝咖啡之前的统计数据已经不可靠了,但我猜1 / sqrt(n_guess)的误差等级是多少。要得到n位数,您需要一个EDOCX1[1]的错误,所以您需要大致的EDOCX1[2]随机猜测。如果你按照你的建议做1E100个猜测,你只能得到50位数的π!因此,迭代次数是所需位数的某种指数函数,速度非常慢。一个好的算法可能在你想要的位数上是线性的。

  • 由于需要大量的猜测,您必须开始质疑随机数生成器的质量。

  • 您的算法将被浮点错误限制为1E-16左右。计算圆周率的位数需要某种任意精度的数字格式。

  • 为了加快算法的速度,可以省略sqrt()。

  • 不要使用名为max的变量,这样会覆盖现有的函数。使用n_猜测左右。

快速而肮脏的测试来证明我的理论(咖啡后):

1
2
3
4
5
6
7
8
pie = @(n) 4 * nnz(rand(n,1).^2 + rand(n, 1).^2 < 1) / n;
ntrial = round(logspace(1, 8, 100));
pies = arrayfun(pie, ntrial);

loglog(ntrial, abs(pies - pi), '.k', ntrial, ntrial.^-.5, '--r')
xlabel('ntrials')
ylabel('epsilon')
legend('Monte Carlo', '1 / sqrt(ntrial)')

Monte Carlo result


简短回答:不。

根据你的链接,世界纪录是1E13位数字。如果您可以运行蒙特卡罗算法来获取10e100个样本,您将获得一个pi的估计值,其相对均方根误差为1/sqrt(10e100)=.3e-50(见下文)。这只是第50位的精度。此外,这只是一个"概率"精度:你不能肯定前50位数字是正确的;你只能告诉他们有很高的概率是正确的。

找到n位数精度所需的蒙特卡罗样本数的一般规则是:m蒙特卡罗样本将为您提供1/sqrt(m)的相对均方根精度。这意味着估计值与真实值的偏差约为真实值的1/sqrt(m)分数。为了合理地确信n位是正确的,您需要一个比10 ^-n更好的相对均方根精度,根据所述规则,这需要m=10 ^(2n)个样本。

因此,如果希望(概率)精度为1E13位,则需要10^2E13蒙特卡罗样本,这是不可管理的。