为什么 R 代码 运行 不会将棍子分成三份并构建三角形问题 - 重复循环和求和?
Why wont R code run for breaking stick into three and building triangle problem - repetition loop and summation?
我今天正在练习我的 R 编码,并且正在解决你有一根长度为 1 的棍子并将其分成 3 块的问题。我们需要弄清楚这 3 个碎片形成三角形的概率是多少。针对这个问题,我在网上找到了一些合适的代码,但是它们稍微超出了我的理解范围。
为什么这段代码不起作用?你能告诉我如何解决吗? TIA!
set.seed(12345)
breaks <- sort(runif(n=2))
stick_lengths <- c(breaks[1], breaks[2]-breaks[1], 1-breaks[2])
stick_lengths
repetitions <- 10000
tri <- c(1:10000)
trialstotri <- 0
for(i in 1:repetitions){
break1 <- 0
trials <- 0
while(breaks[1]+(breaks[2]-breaks[1])> 1-breaks[2] TRUE){
breaks <- sample(tri, size=1, replace=TRUE)
trialstotri <- trialstotri + 1 }
print(proportions(TRUE))
}
这是我认为可行的结构,我将留下一些细节供您填写。
repetitions <- 10000
trials <- logical(length = repetitions)
set.seed(12345)
for(i in 1:repetitions) {
# break a stick randomly
breaks <- sort(runif(n=2))
stick_lengths <- c(breaks[1], breaks[2]-breaks[1], 1-breaks[2])
# see if it works as a triangle
if(
(stick_lengths[1] + stick_lengths[2] > stick_lengths[3])
&
() & () ## fill in additional conditions! One is not enough!
) {
trials[i] <- TRUE
} else {
trials[i] <- FALSE
}
}
mean(trials)
Gregor Thomas 有一个很好的教学答案,应该可以帮助您遵循逻辑。不过,可以在一行中完成所有操作:
mean(replicate(10000, !any(diff(c(0, sort(runif(2)), 1)) > 0.5)))
#> 0.252
说明
其工作方式是创建一个长度为 4 的向量,其中包含:0(代表棒的开始),然后是两个有序的随机数(代表中断),然后是 1(代表棒的末端) ).
c(0, sort(runif(2)), 1)
这个向量的 diff
给了我们三个长度加起来为 1 的“片段”。所以我们的棍子长度可以这样创建:
diff(c(0, sort(runif(2)), 1))
从逻辑上讲,如果其中两块的总长度小于另一块的长度,唯一不能构成三角形的方法是。只有当其中一个片段的长度超过 0.5 时才会发生这种情况。
我们可以通过
找出我们的作品是否有超过 0.5 的
any(diff(c(0, sort(runif(2)), 1)) > 0.5)
然而,这个returns TRUE
如果我们不能做一个三角形而FALSE
如果我们可以,所以我们想取反它与 !
运算符。
!any(diff(c(0, sort(runif(2)), 1)) > 0.5)
这给了我们一个 运行 的实验。要将它 运行 10,000 次到 return 一个 向量 的 TRUE 和 FALSE 我们可以使用 replicate
:
replicate(10000, !any(diff(c(0, sort(runif(2)), 1)) > 0.5))
获得此向量中 TRUE
的比例的最快方法是取其平均值。这通过将 TRUE 值隐式转换为 1 并将 FALSE 值隐式转换为 0 来实现。
因此,我们得到了单行实验 10,000 运行 秒的最终结果:
mean(replicate(10000, !any(diff(c(0, sort(runif(2)), 1)) > 0.5)))
我今天正在练习我的 R 编码,并且正在解决你有一根长度为 1 的棍子并将其分成 3 块的问题。我们需要弄清楚这 3 个碎片形成三角形的概率是多少。针对这个问题,我在网上找到了一些合适的代码,但是它们稍微超出了我的理解范围。
为什么这段代码不起作用?你能告诉我如何解决吗? TIA!
set.seed(12345)
breaks <- sort(runif(n=2))
stick_lengths <- c(breaks[1], breaks[2]-breaks[1], 1-breaks[2])
stick_lengths
repetitions <- 10000
tri <- c(1:10000)
trialstotri <- 0
for(i in 1:repetitions){
break1 <- 0
trials <- 0
while(breaks[1]+(breaks[2]-breaks[1])> 1-breaks[2] TRUE){
breaks <- sample(tri, size=1, replace=TRUE)
trialstotri <- trialstotri + 1 }
print(proportions(TRUE))
}
这是我认为可行的结构,我将留下一些细节供您填写。
repetitions <- 10000
trials <- logical(length = repetitions)
set.seed(12345)
for(i in 1:repetitions) {
# break a stick randomly
breaks <- sort(runif(n=2))
stick_lengths <- c(breaks[1], breaks[2]-breaks[1], 1-breaks[2])
# see if it works as a triangle
if(
(stick_lengths[1] + stick_lengths[2] > stick_lengths[3])
&
() & () ## fill in additional conditions! One is not enough!
) {
trials[i] <- TRUE
} else {
trials[i] <- FALSE
}
}
mean(trials)
Gregor Thomas 有一个很好的教学答案,应该可以帮助您遵循逻辑。不过,可以在一行中完成所有操作:
mean(replicate(10000, !any(diff(c(0, sort(runif(2)), 1)) > 0.5)))
#> 0.252
说明
其工作方式是创建一个长度为 4 的向量,其中包含:0(代表棒的开始),然后是两个有序的随机数(代表中断),然后是 1(代表棒的末端) ).
c(0, sort(runif(2)), 1)
这个向量的 diff
给了我们三个长度加起来为 1 的“片段”。所以我们的棍子长度可以这样创建:
diff(c(0, sort(runif(2)), 1))
从逻辑上讲,如果其中两块的总长度小于另一块的长度,唯一不能构成三角形的方法是。只有当其中一个片段的长度超过 0.5 时才会发生这种情况。
我们可以通过
找出我们的作品是否有超过 0.5 的any(diff(c(0, sort(runif(2)), 1)) > 0.5)
然而,这个returns TRUE
如果我们不能做一个三角形而FALSE
如果我们可以,所以我们想取反它与 !
运算符。
!any(diff(c(0, sort(runif(2)), 1)) > 0.5)
这给了我们一个 运行 的实验。要将它 运行 10,000 次到 return 一个 向量 的 TRUE 和 FALSE 我们可以使用 replicate
:
replicate(10000, !any(diff(c(0, sort(runif(2)), 1)) > 0.5))
获得此向量中 TRUE
的比例的最快方法是取其平均值。这通过将 TRUE 值隐式转换为 1 并将 FALSE 值隐式转换为 0 来实现。
因此,我们得到了单行实验 10,000 运行 秒的最终结果:
mean(replicate(10000, !any(diff(c(0, sort(runif(2)), 1)) > 0.5)))