【发布时间】:2018-03-07 07:48:15
【问题描述】:
我是 R 的新手,如果我问了一个愚蠢的问题,我很抱歉。 我正在尝试从正态分布生成随机数,只要它们会形成递减的数字序列,这意味着生成器会在 Y_n
我知道我必须使用一些 for 和 while 循环,但我不知道如何。
非常感谢。
【问题讨论】:
标签: r random sequence normal-distribution
我是 R 的新手,如果我问了一个愚蠢的问题,我很抱歉。 我正在尝试从正态分布生成随机数,只要它们会形成递减的数字序列,这意味着生成器会在 Y_n
我知道我必须使用一些 for 和 while 循环,但我不知道如何。
非常感谢。
【问题讨论】:
标签: r random sequence normal-distribution
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。但它可以满足您的要求。
【讨论】:
类似这样的:
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 <- c(x, "some single value")。如果您要添加一个元素,最好将其添加到您想要的位置,尤其是在循环中。
如果您想“以高概率”避免增长向量,您可以批量生成数字。批量大小为 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 日创建。
【讨论】: