这是计算 pi 的一个很好的练习,但它可能是一个非常低效的练习。一些备注:
在我喝咖啡之前,我的统计数据已经生锈了,但我猜误差与1 / sqrt(n_guess)
. 要获得 N 位数,您需要 的误差10^(-N)
,因此您需要大致(10^N)^2
随机猜测。如果您按照您的建议进行 1e100 次猜测,您将只能得到 50 位 pi 的数量级!因此,迭代次数是所需位数的指数函数,这非常慢。一个好的算法可能在你想要的位数上是线性的。
由于需要大量猜测,您必须开始质疑随机数生成器的质量。
您的算法将被浮点错误限制为 1e-16 左右。计算 pi 的位数需要某种任意精度的数字格式。
为了加快你的算法,你可以省略 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)')