Во-первых, нет результатов factorial(36)
, поскольку вы повторяете элементы.Если мы сделали, чтобы получить общее число, мы можем использовать пакет gmp
, чтобы получить:
gmp::factorialZ(36)
Big Integer ('bigz') :
[1] 371993326789901217467999448150835200000000
То, с чем мы на самом деле имеем дело, называется перестановками мультимножеств (как указывает @JakubBucek в комментариях).Используя пакет RcppAlgos
(который я создал) или пакет arrangements
, мы можем легко и правильно рассчитать общее количество результатов и, что более важно, получить желаемые результаты.
Прежде всего, фактическиеколичество результатов:
arrangements::npermutations(0:1, freq = c(18, 18), bigz = TRUE)
Big Integer ('bigz') :
[1] 9075135300
RcppAlgos::permuteCount(0:1, freqs = c(18, 18))
[1] 9075135300
Это следствие комбинаторики.То есть мы должны разделить на произведение числа перестановок одинаковых элементов:
gmp::factorialZ(36) / gmp::pow.bigz(gmp::factorialZ(18), 2)
Big Rational ('bigq') :
[1] 9075135300
Теперь, чтобы сгенерировать ваши случайные перестановки.Для пакета arrangements
мы используем аргумент nsample
.Кроме того, мы можем установить начальное значение для воспроизводимости:
set.seed(123)
r1 <- arrangements::permutations(0:1, freq = c(18, 18), nsample = 10)
set.seed(123)
r2 <- arrangements::permutations(0:1, freq = c(18, 18), nsample = 10)
dim(r1)
[1] 10 36
identical(r1, r2)
[1] TRUE
## only showing 10 columns
head(r1[,1:10])
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 0 0 0 1 1 0 1 1 1
[2,] 1 0 1 1 1 1 1 1 1 0
[3,] 0 0 0 0 0 1 1 0 0 0
[4,] 1 1 1 0 0 1 0 1 0 0
[5,] 0 1 1 0 0 1 1 1 0 1
[6,] 0 0 0 1 1 1 0 1 1 1
А для RcppAlgos
мы вызываем permuteSample
, используя аналогичные аргументы n
и seed
:
r3 <- RcppAlgos::permuteSample(0:1, freqs = c(18, 18), n = 10, seed = 42)
r4 <- RcppAlgos::permuteSample(0:1, freqs = c(18, 18), n = 10, seed = 42)
identical(r3, r4)
[1] TRUE
dim(r3)
[1] 10 36
Оба пакета также очень эффективны.Для генерации 1000 случайных перестановок требуется менее секунды:
system.time(RcppAlgos::permuteSample(0:1, freqs = c(18, 18), n = 1000))
user system elapsed
0.051 0.000 0.052
system.time(arrangements::permutations(0:1, freq = c(18, 18), nsample = 1000))
user system elapsed
0.249 0.000 0.249