为什么 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)))