Как заставить мои существующие R-коды выводить определенное количество нечетных и четных чисел? - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть следующие коды, работающие в R. Он в основном выводит 6 random чисел на основе моего выбора частоты чисел от каждого 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 номеров (3 из 1-го списка, 2 из 2-го списка, 1 из 3-го списка и ни одного из 4-го списка).

Я также хочу добавить к этим кодам возможность выбора количества odd чисел и even чисел в конечном выводе.

Допустим, я хочу сохранить существующие коды, но я хочу, чтобы вывод представлял собой смесь 4 even чисел и 2 odd чисел.

Как я могу это сделать?

1 Ответ

0 голосов
/ 08 сентября 2018

Вариантов может быть много, но проще всего использовать бесконечный цикл. Но перед циклом вам нужно еще 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)

и результат:

4 6 7 11 12 30

6 9 10 16 17 24

8 9 10 11 14 24

...