【问题标题】:Decreasing sequence of numbers generator from concrete distribution in R从R中的具体分布减少数字生成器的序列
【发布时间】:2018-03-07 07:48:15
【问题描述】:

我是 R 的新手,如果我问了一个愚蠢的问题,我很抱歉。 我正在尝试从正态分布生成随机数,只要它们会形成递减的数字序列,这意味着生成器会在 Y_n

我知道我必须使用一些 for 和 while 循环,但我不知道如何。

非常感谢。

【问题讨论】:

    标签: r random sequence normal-distribution


    【解决方案1】:
    x <- rnorm(2)
    i  <- 1
    while (x[i] >= x[i+1]){
      x[i+2] <- rnorm(1)
      i <- i + 1
    }
    if (x[i] < x[i+1]) x <- x[1:i] 
    

    我对这段代码不是很兴奋,因为它在没有事先分配内存(也不好)的情况下增长了一个向量(已经很糟糕),但我想不出一种方法来做 OP 想要的而不增长以这种方式的向量。另外,我希望pythonic有一个R字。这不会是它。它不会是 R-ic。但它可以满足您的要求。

    【讨论】:

      【解决方案2】:

      类似这样的:

      vals <- rnorm(n = 2)
      idx <- length(vals)
      while(vals[idx - 1] < vals[idx]) {
        vals <- append(x = vals, values = rnorm(n = 1))
        idx <- idx + 1
      }
      

      【讨论】:

      • append(x, values)c(x, values) 的包装器,因此您在循环中执行警告x &lt;- c(x, "some single value")。如果您要添加一个元素,最好将其添加到您想要的位置,尤其是在循环中。
      【解决方案3】:

      如果您想“以高概率”避免增长向量,您可以批量生成数字。批量大小为 10 时,您已经不太可能需要增长一次向量。

      性能方面,我不知道什么更快。

      rnormdec <- function(..., batch_size = 10) {
        x <- rnorm(batch_size, ...)
        decreasing <- cummax(diff(x)) < 0
      
        while (all(decreasing)) {
          x <- c(x, rnorm(batch_size, ...))
          decreasing <- cummax(diff(x)) < 0
        }
      
        x[c(TRUE, decreasing)]
      }
      
      set.seed(1)
      
      runs <- lapply(seq_len(1e5), function(...) rnormdec(10))
      table(lengths(runs))
      #> 
      #>     1     2     3     4     5     6     7     8 
      #> 49990 33311 12507  3339   714   116    20     3
      

      reprex package (v0.2.0) 于 2018 年 3 月 7 日创建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多