我想知道以下两个4个数字(1:4
)的混洗是否是随机的,或者就随机性而言,一个可能比另一个更受欢迎:
sample(rep(1:4, 10))
replicate(10, sample(1:4))
尽管具有随机性,但我需要具有相等的1s,2s,3s和4s数。
答案 0 :(得分:2)
这些功能在任何方面都不相等。
f1()输出一个向量,f2()输出一个矩阵。
正如@RicS所说,第一个返回向量,第二个返回矩阵。
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在评论中所述。
但是它们的随机性至少相等吗? 测试一下!
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。