代码之家  ›  专栏  ›  技术社区  ›  user9455316

从R中的具体分布减少数字生成器的序列

  •  1
  • user9455316  · 技术社区  · 6 年前

    我是R的新手,如果我问了一个愚蠢的问题,很抱歉。 我试图从正态分布生成随机数,因为它们将形成一个递减的数字序列,这意味着当Y n<Y\u(n+1)。

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

    非常感谢你。

    3 回复  |  直到 6 年前
        1
  •  2
  •   De Novo    6 年前
    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想要做的事情,而不以这种方式增长一个向量。还有,我希望有一个R字来表示pythonic。不会是这样的。这不是R-ic。但它能满足你的要求。

        2
  •  0
  •   Aleh    6 年前

    类似这样:

    vals <- rnorm(n = 2)
    idx <- length(vals)
    while(vals[idx - 1] < vals[idx]) {
      vals <- append(x = vals, values = rnorm(n = 1))
      idx <- idx + 1
    }
    
        3
  •  0
  •   Mikko Marttila    6 年前

    如果希望“以高概率”避免向量增长,可以成批生成数字。批量大小为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
    

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