- konisimple
- 実験室
- JavaScriptによる様々な方法での円周率計算(モンテカルロ法など)
JavaScriptによる様々な方法での円周率計算(モンテカルロ法など)
モンテカルロ法
正方形の中に4/1円がある座標軸上に、乱数によりランダムに大量の点(座標)を発生させ、円の内部にある座標の数と円の外部にあるものの比が面積の比になることを利用する。(詳しく)
計算
結果
計算結果 | 説明 | |
---|---|---|
ランダム点の数 | 計算した回数 | |
円の中に入った回数 | ランダム点の数のうち、円内に入ったものの数(x2+y2<1を満たす点の数) | |
円周率 | 上の2数より得られる円周率 | |
誤差 | 既に判明している円周率から求めた誤差割合 | |
処理時間 | 計算に要した時間 |
考察
1,000回で誤差3%程度に、10,000回で誤差1%程度に、100,000回で誤差0.1%程度に、1,000,000回で誤差0.05%程度に、10,000,000回で誤差0.01%程度になります。
コンピュータのスペックによっては、10,000,000回以降はきつい場合があります。ブラウザが応答しなくなるかもしれません(><)
あんまり回数を増やすとJavaScriptの疑似乱数の限界にぶちあたる気がします。
総当たり法(モンテカルロ法で乱数を使わない)
モンテカルロ法と同じ理屈だが、乱数ではなく、座標上の全ての点の座標を発生させる。例えば1辺1,000の正方形であれば、1,000,000個の点を打ち、それが円の内部にあるか判定する。
計算
結果
計算結果 | 説明 | |
---|---|---|
1辺の長さ(s) | 一辺の長さ | |
ランダム点の数 | 計算した回数 | |
円の中に入った回数 | ランダム点の数のうち、円内に入ったものの数(x2+y2<s2を満たす点の数) | |
円周率 | 上の2数より得られる円周率 | |
誤差 | 既に判明している円周率から求めた誤差割合 | |
処理時間 | 計算に要した時間 |
考察
一辺の長さ1,000で誤差1.21%、2,000で誤差0.063%、3,000で誤差0.042%、4,000回で誤差0.031%、5,000で誤差0.025%、6,000で誤差0.021%になりました。
ガウス=ルジャンドルのアルゴリズム
非常に収束が良く、よく使われるアルゴリズム。ガウス=ルジャンドルのアルゴリズム - Wikipedia
計算
結果
計算結果 | 説明 | |
---|---|---|
計算回数 | 計算した回数 | |
a | a | |
b | b | |
t | t | |
p | p | |
円周率 | 上の2数より得られる円周率 | |
誤差 | 既に判明している円周率から求めた誤差割合 | |
処理時間 | 計算に要した時間 |
考察
1回で誤差0.032%、2回で誤差 0.0000002348%。たった数回でかなり高い精度で得られる。
注意
- あんまり大きな数にすると、ブラウザが応答しなくなる場合があります。少しずつ数字を上げてみましょう。
- 大きな数にしてオーパーフローになった場合の処理は書いていませんので適宜判断してください。例えば、「ガウスの公式」で計算回数を1023回にすると、Pが10の307乗になり、1024回にするとInfinityとなり計算できなくなります。
- 「誤差」は、正確な円周率の小数第100位までのものと比較しています。「小数第n位まで正解」という表記も出していますが、丸めの扱いの考え方によってはプラマイ1桁の誤差がありえます。また計算の精度はある程度環境に依存するため、大体12桁以下はあまりあてにならない気がします。この辺僕もよくわかっていません。
- コンピュータで生成する乱数は疑似乱数であり、正確な乱数であるとは限りません。
経緯
ふと風呂で思いついたのでやってみた。実はJavaScriptの処理の進捗をプログレスバーで表してみたかったのだが、計算が早すぎて画面には反映できなかった。(するやり方がわからなかった)
- 更新履歴
- 10/01/20:初出
- このページについて
- JavaScriptによる様々な方法での円周率計算(モンテカルロ法など)
- konisimple
- 実験室
- JavaScriptによる様々な方法での円周率計算(モンテカルロ法など)