蒙特卡罗π计算能用于创造世界纪录吗?
蒙特卡罗π计算能用于创造世界纪录吗?
我有这个随机函数来计算圆周率蒙特卡罗风格:
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位数?
简短的回答:不行。
根据你的链接,世界记录是1e13位数字。如果您可以运行蒙特卡罗算法获得10e100个样本,那么您将获得相对RMS误差为1 / sqrt(10e100)=。3e-50的pi估计值(请参见以下内容)。这个精度仅有第50个数字的级别。此外,这只是“概率”精度:您不能确定前50个数字是正确的;您只能告诉它们很有可能是正确的。
找到蒙特卡罗样本需要多少个数字的一般规则是:M蒙特卡罗样本将为您提供1 / sqrt(M)的相对RMS精度。这意味着估计与真实值的偏差为真实值的1 / sqrt(M)部分,近似地。为了相当自信地确定第N个数字是正确的,您需要比10 ^ -N略好一些的相对RMS精度,这根据声明的规则需要M = 10 ^(2N)个样本。
因此,如果您想要(概率上的)1e13个数字的精度,则需要10 ^ 2e13个蒙特卡罗样本,这是不可管理的。
这是一个计算圆周率的不错的练习,但它可能是一个非常低效的练习。一些评论:
-
我的统计学知识在喝咖啡之前已经生疏,但我猜错误率与
1 / sqrt(n_guess)
成比例。要获得 N 位数字,您需要一个10^(-N)
的错误率,因此您需要大约(10^N)^2
次随机猜测。如果你像你所提议的那样进行 1e100 次猜测,你只能获得大约 50 位数的圆周率!计算迭代次数是数字位数的某个指数函数,这非常慢。好的算法可能是您想要的数字位数的线性。 -
由于需要大量猜测,您必须开始质疑您的随机数生成器的质量。
-
你的算法将被浮点误差限制在 1e-16 或者这样的一个范围内。计算圆周率需要某种任意精度的数字格式。
-
为了加快算法的速度,您可以省略 sqrt()。
-
不要使用一个名为
max
的变量,这会覆盖一个现有的函数。使用 n_guess 等变量。
快速而肮脏的测试来证明我的理论(咖啡后):
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)')