我在R
中运行以下代码。根据我从每个random
中选择数字的频率,它基本上输出6个list
数字。
foo <- list(
c(1,2,3,4,5,6,7,8,9,10),
c(11,12,13,14,15,16,17,18,19,20),
c(21,22,23,24,25,26,27,28,29,30),
c(31,32,33,34,35,36,37,38,39,40)
)
names(foo) <- c(3, 2, 1, 0)
list2<- unlist(sapply(seq_along(foo), function(x) sample(foo[[x]], names(foo[x]))))
sort(list2)
因此,以上代码将输出6个random
数字(第1个列表中的3个,第2个列表中的2个,第3个列表中的1个,第4个列表中的一个)。
我还希望能够在最终输出中选择odd
号和even
号的数量。
假设我想保留现有代码,但我希望输出是4个even
数字和2个odd
数字的组合。
我该怎么做?
答案 0 :(得分:1)
可能有很多选择,但是最简单的方法是使用无限循环。但是,在循环之前,您需要再使用2个函数来计算赔率:
is.odd <- function(x) x %% 2 != 0
countOdds<-function(dt){ sum(sapply(dt, is.odd)) }
然后循环是:
while(T){
list2<- unlist(sapply(seq_along(foo), function(x) sample(foo[[x]], names(foo[x]))))
if(countOdds(list2)==2)
break
}
通常,它 连续 会产生不同的答案,但是只有找到2个奇数和4个偶数时,它才会停止。
整个代码为:
foo <- list(
c(1,2,3,4,5,6,7,8,9,10),
c(11,12,13,14,15,16,17,18,19,20),
c(21,22,23,24,25,26,27,28,29,30),
c(31,32,33,34,35,36,37,38,39,40)
)
names(foo) <- c(3, 2, 1, 0)
is.odd <- function(x) x %% 2 != 0
countOdds<-function(dt){ sum(sapply(dt, is.odd)) }
while(T){
list2<- unlist(sapply(seq_along(foo), function(x) sample(foo[[x]], names(foo[x]))))
if(countOdds(list2)==2)
break
}
sort(list2)
结果是: