メンターに「新しい言語を覚えるにはモンテカルロ法で円周率を求めてみたりするといいっすよ!」とアドバイスを頂いたので、盲目的にやってみることにしました。
#何を言っているの?(笑)
しかしながら、「モンテカルロ法で円周率を求め」るという日本語が全く意味がわからず、それを理解することからスタートとなりました(笑)
単語の整理
- モンテカルロ法:乱数を用いて観察、分析すること。モンテカルロとはMonte Carloでモナコ公国のある地区の名前らしいです。
- 乱数:決められた数字の範囲の中で、ランダムに等確率に出力された数値。
- 円周率を求める:私が理解したのは、結論から言うと、単位円の面積を求めるということ。
- 単位円:半径が1の円のこと
まとめると、モンテカルロ法で円周率を求めるとは、数字をランダムで生成してそれを分析し、半径1の円の面積を求めることと理解しました。
まだ、意味がわかりません(笑)
###円周率の求め方
というわけで、ネットに転がっていた頭のいい人たちの考え方をここに整理します。
(1) まず、半径1の円の面積を求めるには、円を四分割します。
(2) そしてそれを一辺が1の正方形の中に収めます。
(3) その正方形を座標と捉え、下図のようにイメージします。
(4) 下が1/4円が入った状態です。(点は一瞬無視してください)
(5) 上の正方形の中にランダムで点を打っていきます(点を見てください)。つまり、(x, y)の配列をランダムに打っていきます。
(6) これをn回(たくさん)やります。
(7) 円の中に入った点(ピンクに色付け)をカウントし、pとします。
(8) どうやって点が円の中にあると判断するか?始点(0, 0)
からランダムな点(x, y)
の長さを計算して、これが1以下であれば円の中と判断すれば良いです。
(9) (0, 0)
から(x, y)
の長さは、これを直角三角形の斜辺として計算すれば良いです。三平方の定理は覚えていますか?(僕は忘れてました)
(10) n回終わったら、pをnで割ると(p/n)、これが1/4円の面積の近似値となります。
(11) p/nを4倍すると、円の値が求まります。
#プログラムにすると
コードですが、僕はこのように書きました。
(コメント欄にて、@scivola さん、 @kojix2 さんのアドバイスもぜひご参照ください)
n = 1000000
count = 0
for i in 0 .. n
z = Math.sqrt((rand ** 2) + (rand ** 2))
if z < 1
count += 1
end
end
#円周circumference
cir = count / n . to_f * 4 #to_f でfloatにしないと小数点以下が表示されない
p cir
-
Math
とは、ビルトインモジュールで、数学系のメソッドをグループ化しているもの。 -
.
レシーバのメッセージを指定(この場合、メッセージとはsqrt()
) -
sqrt()
とはsquare root(平方根)の略。PHPと似てる。
#あとがき
36歳未経験でIoTエンジニアとして転職しました。そのポジションがRubyメインのため、慣れ親しんだPHPを置いて、Rubyの勉強を始めています。
もしご指摘などあればぜひよろしくお願い申し上げます。
noteに転職経験をまとめています↓
36歳未経験者がIoTエンジニアに内定しました(1/3)プログラミング学習遍歴編
36歳未経験者がIoTエンジニアに内定しました(2/3) ジョブチェンジの迷い編