Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1000to1004
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Kombinationen mit Zurücklegen ohne Reihenfolge

Kombinationen mit Zurücklegen ohne Reihenfolge
11.08.2008 22:53:00
Christian
Hallo zusammen,
ich suche eine VBA Lösung für folgende Aufgabe:
Gezogen werden "k" Kugeln aus einer Los-Trommel. Die Trommel enthält "n" Kugeln. Die gezogenen Kugeln werden anschließend zurückgelegt. Gesucht sind die möglichen Kombinationen der Ziehungen. Dabei kommt es nicht auf die Reihenfolge an.
Es kann sowohl k>n als auch n>k sein.
also z. Bsp für k=3, n=3:
1, 1, 1
1, 1, 2
1, 2, 2
1, 1, 3
1, 3, 3
1, 2, 3
2, 2, 2
2, 2, 3
2, 3, 3
3, 3, 3
Bei meinen Recherchen habe ich einen Code von Bernd (bst) mir Rekursion gefunden. Dieser sieht schon sehr vielversprechend aus, aber leider kann ich diesen mit meinen Kenntnissen nicht entsprechend anpassen.
http://www.online-excel.de/fom/fo_read.php?f=1&bzh=-1&h=24953&ao=1
vielen Dank vorab für eure Hilfe
Grüße
Christian

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kombinationen mit Zurücklegen ohne Reihenfolge
12.08.2008 08:35:00
bst
Morgen Christian,
HTH, Bernd
--
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub KombinationenMitZuruecklegenArray(ByVal n As Integer, ByVal k As Integer)
    Dim ar As Variant, i As Long, j As Integer, lngSize As Long
    
    lngSize = WorksheetFunction.Combin(n - 1 + k, k)
    Redim ar(1 To lngSize, 1 To k)
    
    For j = 1 To k
        ar(1, j) = 1 ' ar(1, j) = 0 ' um ab 0 zu zählen
    Next
    
    For i = 2 To lngSize
        For j = 1 To k
            ar(i, j) = ar(i - 1, j)
        Next
        arInc ar, i, n, k, k ' arInc ar, i, n - 1, k, k ' um ab 0 zu zählen
    Next
    Range("A1").Resize(lngSize, k) = ar
End Sub

Sub arInc(ByRef ar As Variant, ByVal i As Long, ByVal n As Integer, ByVal k As Integer, ByVal intSpalte As Integer)
    Dim intVal As Integer, j As Integer
    
    If ar(i, intSpalte) < n Then
        intVal = ar(i, intSpalte) + 1
        For j = intSpalte To k
            ar(i, j) = intVal
        Next
    Else
        arInc ar, i, n, k, intSpalte - 1
    End If
End Sub

Sub TestIt()
    Dim n As Integer, k As Integer, t As Single
    
    n = 3
    k = 3
    
    t = Timer
    KombinationenMitZuruecklegenArray n, k
    Debug.Print "Array", Timer - t
End Sub

Anzeige
als Formel
12.08.2008 08:39:34
WF
Hi Christian,
n in A1 und k in B1
=FAKULTÄT(A1+B1-1)/(FAKULTÄT(B1)*FAKULTÄT(A1-1))
Und k kann NIE größer n sein.
Salut WF

AW: als Formel
12.08.2008 08:42:00
bst
Hi,
"Und k kann NIE größer n sein."
Hier doch. Die Kugeln werden ja wieder zurückgelegt.
Man kann als schon 5 Mal aus 3 Kugeln ziehen :-)
cu, Bernd

AW: als Formel
12.08.2008 09:25:19
Erich
Hi Bernd,
was ist k? Die Anzahl Ziehungen? Christian schreibt richtig:
"Gezogen werden "k" Kugeln aus einer Los-Trommel. Die Trommel enthält "n" Kugeln."
Versuch mal, 5 Kugeln aus einer Trommel zu nehmen, die nur 4 Kugeln enthält... ;-))
Ich denke, Walter liegt da schon richtig.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: als Formel
12.08.2008 09:40:00
bst
Hi Erich,
Du kannst auch 1 Mio mal ziehen.
Der Gag ist ja der, dass die gezogene Kugel nach dem Ziehen wieder zurückgelegt wird!!!
D.h. bei jeder Ziehung, egal der wie vielten das ist, liegen immer k Kugeln im Topf.
cu, Bernd

AW: Bernd hat recht
12.08.2008 10:16:46
Erich
Hi Bernd,
Kommando zurück - k kann größer als n sein, da hast du recht!
(Und mein VBA-Vorschlag erzeugt auch die Liste...)
Bsp. für k=4, n=3 (Anzahl verschiedene Kombis: 15; (n+k-1) über k
1111
1112
1113
1122
1123
1133
1222
1223
1233
1333
2222
2223
2233
2333
3333
Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Kombinationen mit Zurücklegen ohne Reihenfolge
12.08.2008 08:44:08
Reinhard
Moin Christian,
ich habe mich auch daran versucht:

Option Explicit
Sub tt()
Dim A, k, n, colC As New Collection, C, Z(1 To 3), strC, t As Single
Application.ScreenUpdating = False
k = 3
n = 3
t = Timer
A = Anz(k, n)
On Error Resume Next
While colC.Count 


Gruß
Reinhard

AW: Kombinationen mit Wiederholung
12.08.2008 09:27:59
Erich
Hallo Christian,
probier mal

Option Explicit
Sub test()
Dim n As Integer, k As Integer, ii As Integer, tt As String, zz As Long
n = 9
k = 4
For ii = 1 To n
tt = tt & Chr(ii - 1 + Asc("1"))  ' Zeichenvorrat
Next ii
zz = 2         ' Startzeile
Application.ScreenUpdating = False
' 1 steht für "mit Widerholung" (0 für "ohne")
'                      3 ist die Tabellenspalte
Komb_omW 1, tt, n, k, "", zz, 3
Application.ScreenUpdating = True
End Sub
Sub Komb_omW(Wied As Boolean, txt As String, Anz As Integer, _
ELen As Integer, Erg As String, Ze As Long, Sp As Long)
Dim ii As Integer, Laenge As Integer, jj As Integer, iO As Boolean
Laenge = Len(Erg)
For ii = 1 To Anz
If Laenge = Rows.Count - 2 Then Exit Sub
End If
End If
Next ii
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
Danke an alle!
12.08.2008 14:34:35
Christian
Hallo zusammen,
vielen Dank für die Lösungen. Bernd hat das Thema "Zurücklegen" richtig verstanden. Jede gezogene Kugel wird vor dem nächsten Zug zurückgelegt. Daher kann auch "k" größer "n" sein. Meine ursprüngliche Formulierung war vielleicht nicht ganz eindeutig.
Die Lösung von Bernd gefällt mir am Besten, wobei die anderen nätürlich genauso gut funktionieren. Aber ich glaube, dass die String-Operationen mehr Rechenzeit benötigen.
Ihr habt mir sehr geholfen.
viele Grüße
Christian

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige