我正在进行蒙特卡罗实验来计算PI的近似值。来自SICP:
蒙特卡罗方法包括 随机选择样品实验 从一大套,然后制作 在此基础上扣除 估计的概率 列出那些结果 实验。例如,我们可以 近似使用的事实 6 / pi ^ 2是两个概率 随机选择的整数将没有 共同的因素;那是他们的 最大公约数将是1. To 获得近似值,我们 进行大量的实验。 在每个实验中,我们选择两个 随机整数并执行测试 看他们的GCD是否为1.分数 通过测试的次数给出了 我们估计6 / pi ^ 2,来自 我们得到了近似值 PI。
但是当我运行我的程序时,我获得了3.9 ......
这样的值这是我的计划:
(define (calculate-pi trials)
(define (this-time-have-common-factors?)
(define (get-rand)
(+ (random 9999999999999999999999999999999) 1))
(= (gcd (get-rand) (get-rand)) 1))
(define (execute-experiment n-times acc)
(if (> n-times 0)
(if (this-time-have-common-factors?)
(execute-experiment (- n-times 1) acc)
(execute-experiment (- n-times 1) (+ acc 1)))
acc))
(define n-success (execute-experiment trials 0))
(define prob (/ n-success trials))
(sqrt (/ 6 prob)))
我的翻译是麻省理工学院/ GNU 7.7.90
感谢您的帮助。
答案 0 :(得分:11)
好吧,直接回答你的问题,你的if语句倒退了;它应该是这样的。
(if (this-time-have-common-factors?)
(execute-experiment (- n-times 1) (+ acc 1)
(execute-experiment (- n-times 1) acc))
因此,当试验的数量接近无穷大时,你在极限内计算1 - 6 /π 2 。这产生“pi”= sqrt(6 /(1 - 6 /π 2 ))= sqrt(6π 2 /(π 2 - 6))= 3.911)。
让我们在这里退后一步,看看蒙特卡罗方法对我们的计算方法(提示:期望收敛非常慢。你运行了多少次?)......
每个试验给出0或1,概率p = 6 /π 2 。这是一个Bernoulli process的例子,在许多试验 n 中,对于1的 m ,binomial distribution。 / p>
考虑ρ= m / n,即通过除数检验的次数。该a具有p的平均值和p(1-p)/ n的方差,或者stddevσρ = sqrt(p(1-p)/ n)。对于n = 10000,您应该期望std dev为0.00488。 95% of the time you will be within 2 std devs of the mean,5%的时间你会在2 std devs之外,或者在0.5982和0.6177之间。因此,给定n = 10000时,这种方法的π估计值将在3.117和3.167之间,在95%的时间内,超出此范围的时间为5%。
如果你想将试验次数增加100,那么std dev会减少10倍,π的估计值会在3.1391和3.1441之间变窄,置信度为95%。
蒙特卡罗方法很适合进行粗略估计,但是他们需要大量的试验来获得准确的答案,并且通常会达到收益递减的程度。
并不是说这是近似pi的无效方法,只要注意这个问题。
答案 1 :(得分:3)
我发现了我的错误。 谢谢大家。 我在错误的地方增加了成功案例。
更正的代码是:
(define (calculate-pi trials)
(define (this-time-have-common-factors?)
(define (get-rand)
(+ (random 9999999) 1))
(= (gcd (get-rand) (get-rand)) 1))
(define (execute-experiment n-times acc)
(if (> n-times 0)
(if (this-time-have-common-factors?)
(execute-experiment (- n-times 1) (+ acc 1))
(execute-experiment (- n-times 1) acc))
acc))
(define n-success (execute-experiment trials 0))
(define prob (/ n-success trials))
(sqrt (/ 6 prob)))