2010-05-23 8 views
5

In Fällen, in denen Ordnung wichtig ist, ist es ziemlich einfach, die Matrix aller möglichen Ergebnisse zu generieren. Eine Möglichkeit, dies zu tun, ist die Verwendung von expand.grid wie gezeigt here.Generieren Sie eine Matrix aller möglichen Ergebnisse für das Werfen von N-Würfeln (Reihenfolge ignorieren)

Was ist, wenn nicht?

Wenn ich recht habe, ist die Anzahl der möglichen Kombinationen (S+N-1)!/S!(N-1)!, wobei S die Anzahl der Würfel ist, jede mit N Seiten von 1 bis N. (Es unterscheidet sich von der bekannten Kombinationsformel, weil es möglich ist die gleiche Nummer, die auf mehr als einem Würfel erscheint). Wenn Sie zum Beispiel vier sechsseitige Würfel werfen, N = 6 und S = 4, ist die Anzahl der möglichen Kombinationen (4 + 6-1)!/4! (6-1)! = 9!/4! X5! = 126. Wie kann ich eine Matrix dieser 126 möglichen Ergebnisse generieren?

Vielen Dank.

+0

Neu hinzugefügt, um Würfel und Algorithmus hinzuzufügen. –

Antwort

5

Hier ist der Code, den gd047 und Marek freundlicherweise zur Verfügung stellten.

Hinweis: Dies ist optimal in dem Sinne, dass es nicht versucht, alle zu generieren und dann die Betrogenen wegwerfen. It actually generates only those that are required.

Eine Erklärung, warum es funktioniert:

Die möglichen Zahlen auf den Würfeln sind 1 bis N.

Sie eine mögliche Kombination der Würfel Zahlen gegeben sind annehmen: x , x , ..., x S wobei S die Anzahl der Würfel ist.

Da die Reihenfolge wir, dass

x ≤ x ≤ ... annehmen kann, spielt keine Rolle, ≤ x S.

betrachten nun die Sequenz x 1, x 2 + 1, X 3 + 2, ..., x S + S-1.

(ZB: 1,1,1 wird 1,1 + 1,1 + 2 = 1,2,3).

Diese neue Sequenz hat Zahlen von 1 bis N + S-1 und alle Zahlen sind unterschiedlich.

Diese Zuordnung von Ihrer Würfelsequenz zu der neuen, die wir erstellt haben, ist 1-1 und leicht reversibel.

Um eine mögliche Kombination von S-Würfeln mit den Zahlen 1 bis N zu erzeugen, müssen Sie nur alle N + S-1 erzeugen. Wählen Sie S-Kombinationen von S-Zahlen von 1, 2, ..., N + S-1. Wenn Sie eine solche Kombination verwenden, sortieren Sie sie, subtrahieren Sie 0 von der kleinsten, 1 von der kleinsten und so weiter, um Ihre Würfelnummerkombination für S Würfel mit der Nummer 1 bis N zu erhalten. Geben Sie beispielsweise N = 6 und S an = 3.

Sie erzeugen eine Kombination von 3 Zahlen von 1 bis 6 + 3-1 = 8, dh 3 Zahlen von 1,2, ..., 8.

Angenommen, Sie erhalten 3,6,7. Dies ergibt 3, 6-1, 7-2 = 3,5,5.

Wenn Sie 1,2,8. Dies würde zu 1,1,6 übersetzt werden.

Übrigens, diese Zuordnung beweist auch die Formel, die Sie haben.

+0

@Moron Sie haben Recht !. Ich habe gepostet, bevor ich deine Antwort gelesen habe. Ich habe bemerkt, dass es keinen Code gibt. Zweifellos hast du zuerst geantwortet, also füge ich meinen Code als Kommentar zu deiner Antwort hinzu. S <- 6 N <- 4 n <- wählen (S + N-1, N) Ergebnisse <- t (anwenden (Kombination (S + N-1, N), 2, sortieren)) - Matrix (rep (c (0: (N-1)), jeweils = n), nrow = n) –

+0

@ gd047. Ok, ich habe meine Antwort bearbeitet, um deinen Code hinzuzufügen. Fühlen Sie sich frei, die Antwort zu bearbeiten, wenn Sie das Gefühl haben, dass es etwas braucht. –

+1

Dies ist eine sehr umfassende Antwort. Ein Tipp zum Code: 'combn' kann eine Funktion auf jede Kombination anwenden, also' apply (combn (S + N-1, N), 2, sort) 'könnte durch' combn ersetzt werden (S + N-1, N, sortieren) '. – Marek

1

Generaly Sie jedes Ergebnis bestellen müssen von der ursprünglichen expand.grid und dann unique sie zum Beispiel gelten mit:

X <- expand.grid(1:6,1:6,1:6,1:6) 
dim(unique(t(apply(X,1,sort)))) 
#[1] 126 4 

Aber man kann tückisch sein und Teil aller Ergebnisse wählen, die bestellt werden:

X <- expand.grid(1:6,1:6,1:6,1:6) 
dim(subset(X, Var1>=Var2 & Var2>=Var3 & Var3>=Var4)) 
# [1] 126 4 

Zweite Version ist viel schneller.

+0

+1 sehr intelligente Antwort! – nico