如何在多个范围内生成随机数

时间:2017-11-17 03:58:05

标签: r random

我想知道如何在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

我知道我可以通过循环执行此操作,但我想知道是否有任何非循环方式来执行此操作。我试图谷歌,但没有找到很多帮助。

3 个答案:

答案 0 :(得分:4)

我们可以通过以下方式使用sapplysample编写函数

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是您想要的随机生成数字的数量。 minmax是可以绘制数字的范围。

在你的情况下:

> 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