第一题

利用循环实现Buffon实验,估算pi值 代码如下

# 设置参数
d <- 1  # 平行线间距
L <- d / 2  # 针的长度
n <- 10000  # 投针次数

# 初始化相交计数
insec <- 0

# 投针模拟
for (i in 1:n) {
  x <- runif(1, 0, d / 2)  
  theta <- runif(1, 0, pi / 2)  
  
  # 判断针是否与平行线相交
  if (x <= (L * sin(theta)/2)) {
    insec <- insec + 1
  }
}

# 根据相交次数计算pi的估计值
p <- insec / n
result <- (2 * L ) / (p * d)

# 输出结果
print(paste0("估计的pi值为:", result))
## [1] "估计的pi值为:3.16255534471853"

第二题

写一个函数,其中函数参数包括重复次数、针的长度、平行线的间距; 函数代码如下(注意此处为加快速度使用了向量计算)

# 定义Buffon投针实验函数
buffon_experiment <- function(d, L, n) {
  
  # 向量化操作:生成随机的起始位置和角度
  x <- runif(n, 0, d / 2)  # 起始点坐标
  angdes <- runif(n, 0, pi )  # 随机生成角度
  
  # 判断是否与平行线相交
  intersects <- x <= (L * sin(angdes)/2)
  
  # 根据相交次数计算pi的估计值
  prob <- sum(intersects) / n
  pi_b <- (2 * L) / (prob * d)
  
  return(pi_b)
}

# 示例调用
result <- buffon_experiment(d = 1, L = 0.5, n = 10^6)
print(paste0("估计的pi值为:", result))
## [1] "估计的pi值为:3.13701870290551"

第三题

探索实验中相关度量(试验次数、针和横线间距)对结果的影响。(例如思考针的长度对结果的影响,通过模拟结果给出建议长度)

一、

试验次数的影响,我们认为实验次数越多估算结果越精确 实验如下

# 设置参数
d <- 1
L <- 0.5
n <- (1:10^2) * 10^5 

# 使用sapply运行多个实验
func<-function(trials) {
  buffon_experiment(d, L, trials)
}
pi_list <- sapply(n, func)

# 绘制结果
plot(n, pi_list, type = "l", col = "blue", 
     xlab = "投针次数", ylab = "估计的pi值", 
     main = "Buffon投针实验中实验次数对pi值估计的影响")
abline(h = pi, col = "red", lty = 2)  # 添加真实pi值的水平线

二、

针的长度的影响,我们认为针的长度越长估算结果越精确 实验如下

# 设置参数
d <- 1
L <- (1:100)/100
n <- 10^6

# 使用sapply运行多个实验
func<-function(trials) {
  buffon_experiment(d, trials, n)
}

pi_list <- sapply(L, func)

# 绘制结果
plot(L, pi_list, type = "l", col = "blue", 
     xlab = "针的长度", ylab = "估计的pi值", 
     main = "Buffon投针实验中针的长度对pi值估计的影响")
abline(h = pi, col = "red", lty = 2)  # 添加真实pi值的水平线

三、

横线间距的影响,我们认为横线间距越短估算结果越精确 实验如下

# 设置参数
d <- (5:105)/10
L <- 0.5
n <- 10^6

# 使用sapply运行多个实验
func<-function(trials) {
  buffon_experiment(trials, L, n)
}

pi_list <- sapply(d, func)

# 绘制结果
plot(d, pi_list, type = "l", col = "blue", 
     xlab = "横线间距", ylab = "估计的pi值", 
     main = "Buffon投针实验中横线间距对pi值估计的影响")
abline(h = pi, col = "red", lty = 2)  # 添加真实pi值的水平线