我想知道如何在R中以下列方式生成随机数:
randomly choose 1 number between 1 and 15
randomly choose 1 number between 16 and 30
...
randomly choose 1 number between 86 and 100
我知道我可以通过循环执行此操作,但我想知道是否有任何非循环方式来执行此操作。我试图谷歌,但没有找到很多帮助。
答案 0 :(得分:4)
我们可以通过以下方式使用sapply
和sample
编写函数
select_1_number_in_range <- function(start, stop, interval) {
sapply(seq(start, stop, interval), function(x) sample(x:(x+interval-1), 1))
}
set.seed(31)
select_1_number_in_range(1, 100, 15)
#[1] 9 31 37 52 76 83 104
我们在seq
作为interval
参数的范围之间生成by
,并从每个列表中选择一个数字。
注意:100不能被15整除,所以这会延长到105.
答案 1 :(得分:4)
首先,100不能被15整除,所以这个答案最多可以达到105。
首先创建一个带1:105
行的整数矩阵105/15
。然后我们简单地为每一行采样一列。这样我们就可以从每个范围中获得一个随机值,而无需使用循环。
## set up
n <- 105
m <- matrix(1:n, nrow=n/15, byrow=TRUE)
## execute
m[cbind(1:nrow(m), sample(ncol(m), nrow(m)))]
# [1] 5 23 33 51 74 77 103
在这里,我们可以看到10次重复。每列都是一个样本。
replicate(10, m[cbind(seq(nrow(m)), sample(ncol(m), nrow(m)))])
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 4 11 10 3 8 5 14 11 5 15
# [2,] 20 20 17 23 25 25 24 19 23 19
# [3,] 45 34 42 35 35 42 32 38 39 44
# [4,] 55 54 49 55 54 46 53 60 47 46
# [5,] 67 73 61 62 75 66 67 62 61 69
# [6,] 83 83 78 79 77 89 79 87 87 86
# [7,] 91 102 95 104 96 94 93 95 100 97
答案 2 :(得分:0)
使用runif()
。它的作用是runif(n, min = x, max = y)
。
n
是您想要的随机生成数字的数量。 min
和max
是可以绘制数字的范围。
在你的情况下:
> runif(1, min=1, max=15)
[1] 2.916329
> runif(1, min=16, max=30)
[1] 28.54506
> runif(1, min=86, max=100)
[1] 87.43045
请注意,上面生成的数字有十进制数字。如果你想要整数,请将上面的内容插入round()即
> round(runif(1, min=1, max=15), digits=0)
[1] 7
> round(runif(1, min=16, max=30), digits=0)
[1] 23
> round(runif(1, min=86, max=100), digits=0)
[1] 90