Zahlen Kombinationen x= n!/(k!(n-k)!)

  • Ich hab mal eine frage ich möchte gerne ein programm schreiben das mein problem löst. Ich habe noch kein Code. Mit Excel + Macro kommt nur müll raus.

    Problem:
    anzahl an möglichkeiten= n!/(k!(n-k)!)
    Das programm soll nicht nur die möglichkeiten ausrechnen sondern mir eine Liste mit allen Möglichkeiten liefern.

    Ein Test mit n = 11 und k = 3 zum nachvollziehen wäre toll.
    Könnt ihr mir einen Code schreiben oder mich auf seiten mit einer Lösung die mir hilft zeigen?

    Danke Skar

    Einmal editiert, zuletzt von Skar (10. Dezember 2010 um 10:54)

  • Die Ausrufezeichen sind in der Mathematik das Zeichen für Fakultät, z.B.:
    3!=1*2*3
    Also wäre die Formel [1*2*3*..*n]/([1*2*3*..k]*([1*2*3*..[n-k]))
    Üblicherweise wird Fakultät als Funktion benutzt, je nach Geschmack rekursiv oder als Schleife.
    Zu Beachten ist die Fakultät von 0, denn 0!=1
    Achso, ich vergaß: Es werden sehr schnell sehr große Zahlen ermittelt, FreeBASIC kann afair bis 172! und dann ist Sense.
    (49! ist 6,082818640342675608722521633213e+62, mit dem m$ Calc.exe berechnet, da ist es n!..)
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

  • Das ist ein Fakultäts zeichen.
    0!=1
    1!=1
    2!=1*2=2
    3!=1*2*3=6
    u.s.w


    Ich hab n=11 -> 11 Sachen, Murmeln, Apfel, Buchstaben, Zahlen ^^
    und k=3 -> das ist die Kombination
    Also folgt
    n=11= {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11} = 11 Zahlen
    mit k ergibt sich {1 , 2 , 3} = eine möglichkeit von oben

    Mein Beispiel:
    Was ich haben will ist ...
    11!/(3!(11-3)!) = 165 möglichkeiten

    Kombinationsmöglichkeiten:
    {1,2,3} , {1,2,4} , {1,2,5} , {1,2,6} , {1,2,7} , {1,2,8} , {1,2,9 }, {1,2,10} , {1,2,11}
    {2,3,1} ist nicht koreckt da {1,2,3} die zahlen schon enthält, ... , {2,3,4}
    usw

    Hilft das als zusätzliche erklärung dir?

  • Skar: es gab einmal einen Uit(-light?) zu Lottozahlen vielleicht wirst du ja dort fündig,

    stayawayknight: ! ist eine Rechenanweisung das ! gibt an das alle natürlichen,positiven Zahlen bis einschliesslich n miteinander multipliziert werden, Wenn n also 11 ist 1*2*3*4*5*6*7*8*9*10*11 = 39916800

    die Lösung bei n=11 und k=3 ist also: 1*2*3*4*5*6*7*8*9*10*11/((1*2*3)*(1*2*3*4*5*6*7*8 )) = 165

    Diese Formel wird z.B.: für Gewinnspielwarscheinlickeiten benutzt, im Beispiel von skar ist nicht anderes als Lotto 3 aus 11, deshalb mein Hinweis auf den Lotto-UIT

    Edit:

    Zitat von wikipedia [url

    http://de.wikipedia.org/wiki/Fakult%C3%A4t_%28Mathematik%29[/url]] * Ein Begriff, der in der abzählenden Kombinatorik eine ähnlich zentrale Stellung wie die Fakultät einnimmt, ist der Binomialkoeffizient

    autoit.de/wcf/attachment/12001/

    Er gibt die Anzahl der Möglichkeiten an, eine k-elementige Teilmenge aus einer n-elementigen Menge auszuwählen. Hier ist das beliebteste Beispiel das Zahlenlotto 6 aus 49 mit

    autoit.de/wcf/attachment/12002/

    Möglichkeiten.


    mfg autroBert

  • Was ich hir will ist aber kein Lotto ^^ und auch kein gewinnspiel ^^.
    Aber ja das ist mir schon mal untergelaufen. Doch war es irgend wie nicht so das ich da durchblickte...

    Spoiler anzeigen


    Doch ist mir das zu blöd. Ich möchte es so haben wenn ich n und k angebe das ich dann die ergebnisse bekomme, und nicht mit VBS sondern mit Auto IT.

  • Ist doch auch ganz einfach ^^

    Spoiler anzeigen
    [autoit]

    Func fak($Zahl) ;fakultät berechnen
    Local $d=1.0, $i
    If $Zahl<0 Then Return 'Argument negativ(Zahl=' &$Zahl &'), das ist nicht definiert.'
    For $i=2 To $Zahl
    $d*=$i
    Next
    Return $d
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func nueberk($n, $k) ;Bartsch, Mathematische Formeln, DDR 1977
    Return fak($n)/(fak($k)*fak($n-$k))
    EndFunc

    [/autoit]

    Edit: Hoffentlich sind jetzt alle FreeBASIC 'Schreibfehler' entfernt..
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    Einmal editiert, zuletzt von ytwinky (9. Dezember 2010 um 16:25)

  • Hi Skar,

    Hier meine Lösung zu deinem Problem.

    &quot;Liste der Kombinationen&quot;
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $n=1, $k=1

    [/autoit] [autoit][/autoit] [autoit]

    Global $time = 0, $sleep=10, $aElemente, $aKombiSolo, $aKombi, $aKombiTmp

    [/autoit] [autoit][/autoit] [autoit]

    If $k <= 0 Or $n <= 0 Then
    MsgBox(0, "Die Antwort nach dem Leben, dem Universum und dem ganzen Rest, lautet...", "42")
    Exit
    EndIf
    If $k > $n Then
    MsgBox(0, "Ist $k nicht etwas zu groß gewählt?", "Programm abbruch!")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If Not (MsgBox(1, "Der Gesundheitsminister warnt...", "Bei großen n- und/oder k-Werten kann die Berechnung Ihre Gesundheit gefährden!" & @CRLF & @CRLF & "Benutzung auf eigene Gefahr!") = 1) Then Exit
    _main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _main()
    AdlibRegister("time", 1000)
    Sleep(250)
    AdlibRegister("addtime", $sleep*1000)

    [/autoit] [autoit][/autoit] [autoit]

    _init()
    _start($aKombiSolo)

    [/autoit] [autoit][/autoit] [autoit]

    AdlibUnRegister("time")
    AdlibUnRegister("addtime")

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "Mögliche Kombinationen", UBound($aKombi))
    _ArrayDisplay($aKombi)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _init()
    Dim $aElemente[$n]
    For $i = 0 To UBound($aElemente) - 1
    $aElemente[$i] = $i + 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aKombiSolo[$k]
    For $i = 0 To $k - 1
    $aKombiSolo[$i] = $aElemente[$i]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aKombi[1] = [_ArrayToString($aKombiSolo, ",")]
    Dim $aKombiTmp = $aKombi
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _start($a, $i=0)
    If $i < $k-1 Then _start($a, $i+1) ; nur zur besseren Darstellung des Ergebnisses - kann auch auskommentiert werden
    $aCopy = $a
    For $j = 0 To UBound($aElemente) - 1
    If _ArraySearch($aCopy, $aElemente[$j]) = -1 Then
    $a[$i] = $aElemente[$j]
    $aTmp = $a
    _ArraySort($aTmp)
    $sTmp = _ArrayToString($aTmp, ",")
    If _ArraySearch($aKombiTmp, $sTmp) = -1 Then
    _ArrayAdd($aKombiTmp, $sTmp)
    _ArrayAdd($aKombi, _ArrayToString($a, ","))
    EndIf
    If $i < $k-1 Then _start($a, $i+1)
    EndIf
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func time()
    ConsoleWrite(".")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func addtime()
    $time += $sleep
    ConsoleWrite($time & " Sekunden vergangen!" & @CRLF)
    EndFunc

    [/autoit]