利用循环实现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值的水平线