# パッケージがインストール済なら次の行は不要
# import Pkg; Pkg.add(["Distributions","Plots"])
using Distributions, Plots
import Random  # 乱数を扱うためのモジュールをインポート
function f(x)  # 被積分関数f(x)
    return sin(x)
end
# モンテカルロ法による積分計算
function monte_carlo(n, a)
    sigma = 0
    Random.seed!(1)  # 乱数のシード値を固定
    for i in 1:n
        Z = rand(Uniform(0, a))  # U(0,a)に従う乱数を1個生成
        sigma += f(Z)
    end
    return sigma / n
end
# プロット関数
function mc_plot(n,a)
    y = zeros(n)
    for i in 1:n
        # 配列yにmonte_carlo(i,a) (i=1,2,...,n)を順に代入
        y[i] = monte_carlo(i,a)
    end
    plot(1:n, y, title = "n = $n", 
         xlabel = "n", ylabel = "Monte Carlo integration", legend = false)
end
a = pi  # 円周率π
mc_plot(3000, a)
integral_val = 2  # ∫[0,a]f(x)dx=∫[0,π]sin(x)dxの理論値
# モンテカルロ積分の系列が理論値に収束する様子を描画
hline!([integral_val / a], color = :blue)