ラズベリーパイ(Raspberry Pi)のパイは円周率ではないのです。
もちろんお菓子のパイでもありません。
パイはPythonから取ったそうな。。
・・・ネタにならないねぇ。
モンテカルロ法で円周率を求めてみるサンプル
モンテカルロ法で円周率を求めてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import java.util.Random; public class MonteCarloTest { public static void main(String[] args) { //とりあえず100,000回試行 int trial = 100000; Random random = new Random(); int counter = 0; for (int i = 0; i < trial; i++) { //0~1でランダムで座標を取得 double x = random.nextDouble(); double y = random.nextDouble(); //円の中ならカウント(三平方で取った距離が1以下) if (x * x + y * y <= 1) { counter++; } } //円の中のカウント数 / 試行回数 = πr^2 / 4r^2 = π / 4 //なので、π = 4 * 円の中のカウント数 / 試行回数 double pi = 4.0 * counter / trial; System.out.println("円周率は... " + pi + "かもね^^"); } } |
実行結果
モンテカルロ法で求めた円周率が表示されます。
1 | 円周率は... 3.1426かもね^^ |
まあ、こんなもんかな??
サンプルの解説
ランダムで点(x,y)を打ちます。
その点が円に入っていればカウントアップしておき、最終的に円の中に打てた数と全体の試行回数から円周率を求めます。
コメントにも書いてますが、
円の面積:正方形の面積(点の打てるとこ) = 円の中のカウント数 : 試行回数なので・・・
円周率は「4 * 円の中のカウント数 / 試行回数」になります。
ただし、円だと面倒なので1/4の円で計算してます。
グラフで言えば、原点を中心に半径1の円の1/4部分(第一象限のとこ)相当ですね。
・・だからと言って、面積の比率は変わらんのでそのまま計算できます。
また、点が円の中かどうかの判定は、三平方の定理で求めた、原点からの距離が1以内(ここでは円の半径が1なんで)かどうかです。
Random#nextDouble()の乱数範囲は0≦x<1なんで、これまた都合が良いですね。
結果は、3.14159265・・と比べれば、まだまだです。
回数を増やせば、もうちょっと近づくかもですね。