假设我有一组数字:
a <- 1:10
我想从这些数字中创建所有非冗余对:
pairs <- t(combn(1:10,2))
然后,对于每一对,我检查该对的第一个元素是否大于第二个元素:
a[pairs[,1]]>a[pairs[,2]]
由于数据集已排序,因此每对的FALSE
得到a<-sample(a)
,因为该对的第二个元素总是更大。
我可以重新调整原始数据集:
a[pairs[,1]]>a[pairs[,2]]
并重做相同的比较:
a
现在我得到了TRUE和FALSE两种情况。
我的问题是:有没有办法最大化方差:即,任何大小的变量if let stillOptional = viewController.navigationController, let notOptional = stillOptional {
//use notOptional here
}
都有相等或近似相等的TRUE和FALSE个案数?
答案 0 :(得分:0)
这样的事情可行。期望你收敛到相等数量的TRUE和FALSE。
pairs <- t(combn(1:10,2))
for (i in 1:nrow(pairs)) {
if (runif(1) > .5) {
tmp <- pairs[i,1]
pairs[i,1] <- pairs[i,2]
pairs[i,2] <- tmp
}
}
table(pairs[,1] > pairs[,2])
# FALSE TRUE
# 25 20
答案 1 :(得分:0)
有趣的问题!
这是一个算法,为您提供X =(1,2,3 ...,n)所需的排列:
最初取空结果向量Y并设置round = 1
。每轮都做:
重复直到X耗尽。如果X的长度是奇数,那么最后只需将最终项添加到Y.
所以最后Y =(1,n,n-1,2,3,n-3,...,n / 2)。
以下是上述算法的R实现:
这是非随机的,并且保证返回相等(或如果总数不均匀则返回尽可能相等)所有长度的真假数例n > 1
max_var_sequence = function(n) {
mid_point = ceiling((n+1)/2)
#initiate the vector
a1 = rep(mid_point,n)
for(i in 1:(n/2)) {
even = i %% 2
a1[i*2 - even] = i
a1[i*2 - !even] = n + 1 -i
}
return(a1)
}
n = 20
pairs <- t(combn(1:n,2))
s = max_var_sequence(n)
x = s[pairs[,1]]>s[pairs[,2]]
table(x)