# 1. 打つ点の数を決める（数が多いほど正確になります）
N <- 100000

# 2. 正方形の中にランダムな点 (X, Y) を大量に生成
# (0から1の間の一様乱数)
x_points <- runif(N, min = 0, max = 1)
y_points <- runif(N, min = 0, max = 1)

# 3. 三平方の定理（x^2 + y^2 <= 1）を使って、円の中に入っているか判定
# inside は、円の中なら TRUE、外なら FALSE のベクトルになります
inside <- (x_points^2 + y_points^2) <= 1

# 4. 円の中に入った割合を計算する
# (TRUEは1、FALSEは0として計算されます)
ratio <- sum(inside) / N

# 5. 4倍して円全体の面積（＝パイ）を求める
estimated_area <- ratio * 4

# 結果を表示
cat("投じた点の数 :", N, "\n")
cat("推定された面積:", estimated_area, "\n")
cat("実際のπの値   :", pi, "\n")

# 最初の5000点だけをプロット（全点だと画面が真っ黒になるため）
plot_n <- 5000
colors <- ifelse(inside[1:plot_n], "blue", "red")

# グラフの描画
plot(x_points[1:plot_n], y_points[1:plot_n], col = colors, pch = 20,
     main = paste("モンテカルロ法による面積計算 (推定値:", estimated_area, ")"),
     xlab = "X", ylab = "Y", asp = 1)

# 実際の円の境界線を引く
curve(sqrt(1 - x^2), add = TRUE, col = "black", lwd = 3, from = 0, to = 1)