R:创建具有特定数量的随机数的向量

时间:2015-02-06 23:50:01

标签: r vector

我希望有人可以帮我指出正确的方向在R中创建一个向量,包含一定数量的随机生成的数字。我是R的完全新手,我已经了解到连接函数用于创建向量。但是,我希望用50个随机数填充向量。我不希望为数字指定范围或任何其他条件。

MyVectorObject <- c(...)

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:5)

这取决于您要生成的数字。这些是一些选择。

x1 <- rpois(n = 50, lambda = 10)
x2 <- runif(n = 50, min = 1, max = 10)
x3 <- sample(x = c(1, 3, 5), size = 50, replace = TRUE)

答案 1 :(得分:2)

如果我们在谈论整数,你想要在区间&lt; -base ::。Machine $ integer.max,base ::。Machine $ integer.max&gt; 中生成数字,这是例如,在我的计算机间隔&lt; -2147483647,2147483647&gt;


实施

您可以使用 base :: sample 1 生成正数到 base ::。Machine $ integer.max

random.pos <- function(N) { 
  int.max        <- .Machine$integer.max
  return(sample(int.max, N, replace=TRUE))
}

如果您还想要负数,可以使用

random.posneg <- function(N) {
  int.max        <- .Machine$integer.max   
  random.numbers <- sample(int.max, N, replace = TRUE)
  random.signs   <- sample(c(1,-1), N, replace=TRUE)      
  return(random.numbers * random.signs)
}

注意:上面指定的函数中没有人生成0(零)

最好的方法(我认为)是使用 base :: runif 函数。

random.runif <- function(N) {
  int.max        <- .Machine$integer.max
  int.min        <- -int.max
  return(as.integer(runif(N, int.min, int.max)))
}

这会比使用 base :: sample 慢一点,但你会得到均匀分布的随机数,可能为零。


基准

library(microbenchmark)
require(compiler)

random.runif  <- cmpfun(random.runif)
random.pos    <- cmpfun(random.pos)
random.posneg <- cmpfun(random.posneg)

N <- 500

op <- microbenchmark(
  RUNIF  = random.runif(N),
  POS    = random.pos(N),
  POSNEG = random.posneg(N),
  times  = 10000
)

print(op)
## library(ggplot2)
## boxplot(op)
## qplot(y=time, data=op, colour=expr) + scale_y_log10()

以及上述基准测试的结果

Unit: microseconds
   expr    min     lq      mean median     uq      max neval
  RUNIF 13.423 14.251 15.197122 14.482 14.694 2425.290 10000
    POS  4.174  5.043  5.613292  5.317  5.645 2436.909 10000
 POSNEG 11.673 12.845 13.383194 13.285 13.800   60.304 10000