program montecarlo implicit none integer,parameter :: kosuu=1024 ! 発生させる乱数の数 real :: p,x,y,s,ysouwa,y2souwa,sekibun,bunsan,sdom real,parameter :: x_kaishi=0.0,x_shuryo=1.0 ! 積分区間の始点と終点 real,parameter :: x_haba=x_shuryo-x_kaishi integer :: i ysouwa = 0.0 y2souwa = 0.0 do i = 1,kosuu call random_number(p) ! 0から1の範囲でランダムに実数 p を発生させ x = x_kaishi+p*x_haba ! p に基づいて x_kaishi から x_shuryo までの実数 x を作る y = 1.0/(1.0+x**2) ! x における被積分関数の値を計算 s = y*x_haba ! 高さ y、幅 x_haba の長方形として定積分を近似する ysouwa = ysouwa+s !「長方形の面積」の総和をとる y2souwa = y2souwa+s**2 !「長方形の面積」の2乗の総和をとる end do sekibun = ysouwa/real(kosuu) ! 「長方形の面積」の「期待値」として定積分を求める bunsan = y2souwa/real(kosuu)-sekibun**2 ! 「長方形の面積」の不偏でない「分散」 sdom = sqrt(bunsan/real(kosuu-1)) ! 「長方形の面積」の「平均値の標準偏差」 write(*,*)kosuu,sekibun,sekibun*4.0,abs(sekibun-atan(1.0)),sdom end program montecarlo