R中两个混洗代码的相等性

时间:2019-01-10 19:15:17

标签: r random sample sampling

我想知道以下两个4个数字(1:4)的混洗是否是随机的,或者就随机性而言,一个可能比另一个更受欢迎:

sample(rep(1:4, 10))

replicate(10, sample(1:4))

约束:

尽管具有随机性,但我需要具有相等的1s,2s,3s和4s数。

2 个答案:

答案 0 :(得分:2)

这些功能在任何方面都不相等。


1。类型

  

f1()输出一个向量,f2()输出一个矩阵。

正如@RicS所说,第一个返回向量,第二个返回矩阵。


2。时间

  

f1()比f2()快50倍。

运行时差异在更大范围内变得更加清晰:

set.seed(1701)

# Functions
f1 <- function() { sample(rep(1:4, 10000)) }
f2 <- function() { c(replicate(10000, sample(1:4))) }

# Benchmark
microbenchmark::microbenchmark(f1(), f2())
Unit: microseconds
 expr      min         lq       mean     median        uq       max neval cld
 f1()   671.28   820.6755   983.9417   988.7985  1046.476  2320.425   100  a 
 f2() 40588.03 43241.0270 48796.0141 45612.0740 54431.890 71117.415   100   b

我们看到f1()明显更快,正如@JosephClarkMcIntyre在评论中所述。

但是它们的随机性至少相等吗? 测试一下!


3。随机性

  

f2()不是随机的。

Bartels等级测试可以测试一系列数字的随机性与非随机性。

> randtests::bartels.rank.test(as.numeric(f1_result$value))

    Bartels Ratio Test

data:  as.numeric(f1_result$value)
statistic = -1.26, n = 40000, p-value = 0.2077
alternative hypothesis: nonrandomness

p值> 0.05,因此未拒绝零假设。
f1()的结果并非非随机。 (这与确保随机性不同)

> randtests::bartels.rank.test(as.numeric(f2_result$value))

    Bartels Ratio Test

data:  as.numeric(f2_result$value)
statistic = 50.017, n = 40000, p-value < 2.2e-16
alternative hypothesis: nonrandomness

p值<0.05,因此原假设被拒绝。
f1()的结果是非随机的

如果您看一下函数本身的结果,这也很明显。

> set.seed(1701)
> replicate(10, sample(1:4))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    4    1    3    3    2    3    3    4     1
[2,]    3    1    2    1    4    3    2    2    3     4
[3,]    4    2    3    2    1    1    4    4    2     2
[4,]    2    3    4    4    2    4    1    1    1     3

它会产生一个包含十列的矩阵,每一列都精确地包含数字1:4。这是非随机

答案 1 :(得分:-1)

在清除注释中的含义之后,两行代码在随机性方面基本相等,因为您将获得10个每个类别的实例(从1到4)。

完成工作的时间基本上是相同的,因为它们总共只有40个数字。

但是,sample(rep(1:4, 10))返回长度为40的整数 vector ,而replicate(10, sample(1:4))输出4x10 matrix ,其中的数字为每列中只绘制一次1到4。