我做一个蒙特卡洛实验来计算PI的近似。从SICP:

  

在蒙特卡洛方法包括   随机选择样本实验   从一个大集,然后进行   的基础上扣除   从概率估计   制表这些结果   实验。例如,我们可以   近似使用的事实,   6 / PI ^ 2是两个概率   随机选择整数不会有任何   因素共同;也就是说,他们的   最大公约数为1。要   获得近似,我们   进行大量的实验。   在每一个实验中,我们选择两种   在随机整数和执行测试   ,看看他们的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)))

我的解释器是MIT / GNU 90年7月7日

感谢您的帮助。

有帮助吗?

解决方案

好了,直接回答你的问题,你有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 。这是一个伯努利过程时,其具有的一个例子,对于1的米数量的在多个试验中的名词的,一个二项分布

考虑ρ= M / N,路过共除数测试时间的分数。这是一个具有平均p的值,p(1-p)的方差/ n或标准偏差σ<子>ρ = SQRT(P(1-P)/ N)。对于n = 10000,你应该期望的0.00488一个标准偏差。 的95%的时间,你会在均值的2个STD开发者,和5%的时候你会在外面2个STD开发者,或者在0.5982和0.6177。所以从这个方法π的估计,给定的n = 10000,将是3.117和时间3.167 95%之间,并且在该范围之外的5%的时间。

如果你想通过100增加尝试的次数,通过10倍减少标准偏差和π的估计得到3.1391和3.1441之间缩小了与95%的置信。

蒙特卡罗方法是一个粗略的估计不错,但他们需要试验的很多很多的一个准确的答案,通常达到收益递减点。

不,这是在接近PI徒劳的方式,仅仅是意识到这个问题。

其他提示

我发现我的错误。 谢谢大家。 我是递增的成功案例在错误的地方。

校正的代码是:

(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)))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top