私は計算PIのために、このスキームプログラムで、私のエラーを見つけることができません
質問
私は、PIの近似値を計算するためにモンテカルロ実験を行っています。 SICPから:
モンテカルロ法は、から成り ランダムにサンプル実験を選びます 大規模なセットから、次に作ります に基づいて控除 確率から推定 これらの結果を集計 実験。例えば、我々はできます 事実を利用して近似 6 / PI ^ 2は、2つの確率であります ランダムに選ばれた整数ではありません持っています 共通因子;それは彼らのことです 最大公約数をするには1になります。 近似値を取得し、我々 多数の実験を行います。 各実験では、2つを選択してください ランダムに整数とテストを実行 彼らのGCDが1分数であるかどうかを確認します テストが与え渡された回の 私たち私たちの6 / PI ^ 2の推定値、およびから この私たちは、私たちに近似値を得ます パイます。
しかし、私は私のプログラムを実行すると、私は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 7.7.90です。
任意の助けてくれてありがとう。
解決
さて、直接あなたの質問に答えるために、あなたは後方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)。
<時間>のはしかし、ここに戻って一歩を踏み出すと、モンテカルロ法は、この計算で私たちのために何をするかを見てみましょう(。?ヒント:非常に遅い収束何回あなたがそれを実行していることを期待)...
各試験は、確率P = 6 /π 2 で、私たちは0または1を与えるのいずれか。これは、1の Mの数のために、持っているベルヌーイ過程に、一例ですは試行回数では、 N 、二項分布するます。
ρ= M / N、共通除数試験を通過回数の割合を考えます。このAは、pの値とP(1-P)の分散/ N、またはSTDのDEVのσ<サブ>ρサブ> = SQRT(P(1-P)/ n)を意味しています。 nに= 10000、あなたは0.00488のSTD devのを期待するべきです。 あなたは平均するの2つのSTDの開発者内であろう時間の95%、および5%時間のあなたは2つのSTDの開発者の外、または0.5982と0.6177の間になるだろう。したがって、この方法からπの推定値は、時間の5%3.117と時間の3.167〜95%とこの範囲外となり、N所与= 10000
あなたは100で試行回数を増やしたい場合は、それが10倍STD DEVを低減し、πの推定値は、95%の信頼度で3.1391と3.1441の間で絞り込まれます。
モンテカルロ法は、概算のための素晴らしいですが、彼らは正確な答えのための臨床試験のLOTSと多くを必要とし、通常は収穫逓減のポイントに到達ます。
これはパイを近似する無益な方法ではないことを、単に問題を認識してます。
他のヒント
私は自分のエラーを見つけます。 ありがとうございます。 私は間違った場所に成功した例をインクリメントしてます。
修正されたコードは、次のとおりです。
(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)))