【发布时间】:2019-02-20 10:52:09
【问题描述】:
我有一个包含 36 个元素的向量 V,18 个是“0”,18 个是“1”。 我想计算这个向量的 N 个随机(不是第一个 N)排列。
我可以这样做:
library(combinat)
N <- 100 # or 200, 300, 500... max 1000
V <- c(rep(0, 18), rep(1, 18))
n <- factorial(36) # total number of unique possible permutations
p <- unique(permn(V))[sample(1:n, N)]
但我很快遇到了组合爆炸问题,因为
sample(1:n, N) 返回Error in 1:n : result would be too long a vector
和
permn(V) 返回Error in vector("list", gamma(n + 1)) : vector size specified is too large
还有其他(更好的)方法可以做到这一点吗?
【问题讨论】:
-
如果你想做
N0和1的随机组合,你为什么要从1:n采样? -
排列必须是唯一的吗?或者你可以做
replicate(N, sample(V))吗? -
没有
factorial(36)可能的排列,因为您正在处理多重集的排列(所有 0 和所有 1 都相同) - 请参阅 link。您可以使用multicool包及其函数allPerm。但是,仍然有485200708变种,并且需要一些时间来生成它们。 -
@pisistrato 请查看link。您无法将一个 0 与另一个 0 区分开来,因此您可以多次计算一些排列。
-
@JosephWood 是的,我注意到你和我的号码不同。我使用了
multicool包和以下代码:x <- rep(0:1, each=18); multinom(x)。这给了我485200708排列。现在,我注意到multinom函数中的参数useDouble可以防止整数溢出。所以multinom(x, useDouble=TRUE)给出了正确的数字。
标签: r permutation