2010-05-22 12 views
3

À titre d'exemple, voici un moyen d'obtenir une matrice de tous les résultats possibles de lancer 4 dés (justes). Comme vous avez déjà comprisComment puis-je savoir combien de lignes d'une matrice satisfont un critère plutôt compliqué (en R)?

z <- as.matrix(expand.grid(c(1:6),c(1:6),c(1:6),c(1:6))) 

, je suis en train de travailler a question that was closed, bien que, à mon avis, il est un défi. J'ai utilisé des techniques de comptage pour le résoudre (je veux dire à la main) et je suis finalement arrivé à un certain nombre de résultats, avec une somme de 5, égale à 1083 sur 1296. Ce résultat est cohérent avec les réponses fournies à cette question, avant qu'il ne soit fermé. Je me demandais comment ce sous-ensemble de résultats (disons z1, où dim (z1) = [1083,4]) pouvait être généré en utilisant R. Avez-vous des idées?

Merci.

Répondre

4
sum(apply(z, 1, function(x) 5 %in% unlist(sapply(1:4, function(i) combn(x, i, sum))))) 
+0

Cool! Beaucoup plus propre que le mien! Je ne connaissais pas la fonction% in%, qui sera utile. ... et je ne savais pas que combn pouvait prendre une fonction en paramètre: D – nico

1

Cela fonctionne pour moi:

require(combinat) 

# Returns the sums of all the possible subsets for a single combination 
comb <- function(values) 
    { 
    sums <- NULL 

    # Sum each combination of 1,2,... n-1 dice 
    for (i in 1:(length(values)-1)) 
     { 
     c <- combn(values, i) 
     sums <- c(sums, colSums(c)) 
     } 

    # Also sum all the dice 
    sums <- c(sums, sum(values)) 

    comb <- sums 
    } 

# Returns TRUE if the array contains a certain value 
hasVal <- function(values, n) 
    { 
    hasVal <- (length(which(values == n)) > 0) 
    } 

dice <- as.matrix(expand.grid(1:6, 1:6, 1:6, 1:6)) 
theSum <- 5 

# Get the sums of all the subsets for each line 
sums <- apply(z, 1, comb) 
# See which columns of sums contain 5 
has5 <- apply(sums, 2, hasVal, theSum) 
# Now count them :) 
print(paste(length(which(has5 == TRUE)), " combinations over ", 
     length(has5), " have a subset that sums to ", theSum)) 

et sorties:

[1] "1083 combinaisons plus de 1296 ont un sous-ensemble qui résume à 5"