Равенство двух кодов тасования в R - PullRequest
0 голосов
/ 10 января 2019

Мне было интересно, являются ли следующие две перетасовки из 4 чисел (1:4) одинаково случайными или, возможно, одно предпочтительнее другого с точки зрения случайности:

sample(rep(1:4, 10))

replicate(10, sample(1:4))

Constraint:

Несмотря на случайность, мне нужно равное число 1, 2, 3 и 4.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Эти функции ни в коем случае не равны.


1. Тип

f1 () выводит вектор, f2 () выводит матрицу.

Как сказал @RicS, первый возвращает вектор, второй возвращает матрицу.


2. Время

f1 () почти в 50 раз быстрее, чем f2 ().

Различия во время выполнения проясняются в большем масштабе:

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 () не является случайным.

Тест ранга Бартельса может проверять ряд числовых чисел на случайность и неслучайность.

> 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, поэтому нулевая гипотеза была отклонена. <br> Результат 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. Это не случайно .

0 голосов
/ 10 января 2019

После очистки того, что вы имеете в виду в комментариях, две строки кода в основном равны по случайности, так как вы получите 10 экземпляров каждой категории (от 1 до 4).

Время выполнения работы, по сути, такое же, поскольку их всего 40 номеров.

Однако sample(rep(1:4, 10)) возвращает целое число вектор длины 40, тогда как replicate(10, sample(1:4)) выводит матрицу 4x10 , в которой числа от 1 до 4 нарисованы ровно один раз в каждом столбце.

...