せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】【アルゴリズム】ハノイの塔 /モンテカルロ法

ハノイの塔

こんなにシンプルに書けるのね!

def hanoi(n, start, goal, tmp)
  return if n == 0
  hanoi(n-1, start, tmp, goal)
  p "move #{n} to #{goal}" 
  hanoi(n-1, tmp, goal, start)
end
hanoi(3, "A", "B", "C")

ビット演算の練習を兼ねて、グレイコードを使った解答を考える。

 

モンテカルロ法

プログラマーは今こそアルゴリズムを書くべき!!~モンテカルロ法でπを計算してみよう(コードあり)~ - nigoblogを参考に。

モンテカルロ法で円周率を計算する。

写経するのは悔しかったので、
長さ1の正方形内に、半径0.5の円が入っているとイメージして実装しました。

ポイント

  • to_fメソッドをつけるタイミング(割り算実行前だよ!)
def pai(chance)
  count = 0
  chance.times do
    x = rand; y = rand
    count += 1 if Math::sqrt((x-0.5)*(x-0.5) + (y-0.5)*(y-0.5)) < 0.5
  end
  answer = (4*count.to_f/chance)
end
p pai(10000)

 

rand

って書くだけでランダムな数値が参照できるんだ!
知らなかった。

Kernelモジュールにrandメソッドが定義されているからか。
self.rand か。 Rubyぽい。


いってきますー。