Comment detail

π (Nested Flatten)
遅い、精度が低い
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import java.util.Random;
/**
 * 教科書的なモンテカルロ法
 */
public class Pi {
    public static void main(String args[]) {
    Random r= new Random();
    int m=1000000;
    double j=0;
    for(int i=0;i<m;i++)
        if(Math.hypot(r.nextDouble(),r.nextDouble())<1.0)
          j++;
    System.out.println(4*j/m);
    }
}

面積から攻めるのはよく知られていますね。

「ビュフォンの針」を実装するのもありでしょう。

手でがんばった人

http://portal.nifty.com/2008/10/01/c/

applet

http://www.f.waseda.jp/takezawa/math/number/buffon/buffon.htm

「ビュフォンの針」は初めて知りました。
というわけで実装。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Needle
  LENGTH = 5
  RAND_MAX = 10000
  attr_reader :x1, :x2

  def initialize()
    @x1 = rand(RAND_MAX) + rand
    @x2 = LENGTH * Math.cos(rand * 2 * Math::PI) + @x1
  end

end

n = 10000
crossed = 0
n.times {
  needle = Needle.new()
  k1 = (needle.x1 / (2 * Needle::LENGTH)).to_i
  k2 = (needle.x2 / (2 * Needle::LENGTH)).to_i
  crossed += 1 if k1 != k2
}

pi = n.to_f / crossed.to_f
puts "pi = #{pi}"

Index

Feed

Other

Link

Pathtraq

loading...