Binomialkoeffizient



  • Hallo ihr,
    also ich soll ein Programm entwerfen indem ich die Aufgabe habe alle möglichen Lottokombinationen zu ermitteln und (vorausgesetzt eine Kombination hat einen Wert von 1€) den zu zahlenden Betrag, da ich mich mit der Aufgabe sehr schwer tue habe ich mich mal im Netz ein bischen informiert, weil ich noch nicht einmal weiß, wo die Fehler liegen und, ob ich die Sache richtig angehe. Zuvor sollte ich noch erwähnen, dass lediglich das Mittel der Schleifen (also kein "if" oder Ähnliches) benutzt werden soll:

    Mein Quellcode:

    #include <stdio.h>
    #include <math.h>
    
    double fac(int n)
    {
        double t=1;
        for (int i=n;i>1;i++)
            t*=i;
        return t;
    }
    
    double Bin(int n,double p,int r)
    {
        double rueckkehrwert;
        rueckkehrwert = fac(n)/(fac(n-r)*fac(r))*pow(p,r)*pow(1-p,n-r);
        return (rueckkehrwert);
    }
    
    int main ()
    
    {
        int n,r,f;
    
        n = 49;
        r = 6;
    
        printf("Wieviel Euro muessen aufgewendet werden, damit man alle potentiellen \n");
        printf("Konstellationen fuer 6 richtige im Lotto ausschoepfen kann?\n\n");
    
        f = Bin (n,p,r);
    
        printf("Die Summe des zu zahlenden Betrages lautet: %d",f);
        printf(" [Euro]");
    
        getchar();
        getchar();
        return(0);
    }
    

    Hat jemand eine Idee? Ich glaube Hauptkonfliktpunkt könnte sein, dass ich nicht weiß, wie ich p als Zahl definieren soll, muss ja denke ich aus der Fakultätsfunktion gezogen werden, bin echt am verzweifeln.
    Danke im voraus.



  • Die Binomialverteilung liefert dir eine Wahrscheinlichkeit, nicht die Anzahl der Kombinationen. Die Binomialkoeffizienten sind in deinem Programm auch schon drin, nämlich fac(n)/(fac(r)*fac(n-r). Das ist der gesuchte Wert, nicht die Wahrscheinlichkeit eines Treffers.
    geloescht



  • geloescht schrieb:

    Die Binomialverteilung liefert dir eine Wahrscheinlichkeit, nicht die Anzahl der Kombinationen. Die Binomialkoeffizienten sind in deinem Programm auch schon drin, nämlich fac(n)/(fac(r)*fac(n-r). Das ist der gesuchte Wert, nicht die Wahrscheinlichkeit eines Treffers.
    geloescht

    Hi geloescht, bedeutet das, dass der unterstrichene Teil: fac(n)/(fac(n-r)*fac(r))*pow(p,r)*pow(1-p,n-r); hinfällig ist?



  • Genau, und der Parameter p auch. 🙂



  • Ja lol, dann kanns ja nicht klappen. Danke schonmal dafür, aber er will mir irgendwie noch kein Ergebnis ausspucken.
    Geänderter Code:

    #include <stdio.h>
    #include <math.h>
    
    double fac(int n)
    {
        double t=1;
        for (int i=n;i>1;i++)
            t*=i;
        return t;
    }
    
    double Bin(int n,int r)
    {
        double rueckkehrwert;
        rueckkehrwert = fac(n)/(fac(n-r)*fac(r));
        return (rueckkehrwert);
    }
    
    int main ()
    
    {
        int n,r,f;
    
        n = 49;
        r = 6;
    
        printf("Wieviel Euro muessen aufgewendet werden, damit man alle potentiellen \n");
        printf("Konstellationen fuer 6 richtige im Lotto ausschoepfen kann?\n\n");
    
        f = Bin (n,r);
    
        printf("Die Summe des zu zahlenden Betrages lautet: %d",f);
        printf(" [Euro]");
    
        getchar();
        getchar();
        return(0);
    }
    


  • Das ist eher C als C++, vor allem die antiken Header und printf ist hier wohl eher unpassend. Nimm ausserdem [ cpp ] anstatt [ code ] Tags, das ist übersichtlicher.

    Hier einiges, was mir an deinem Programm aufgefallen ist:

    boenz666 schrieb:

    #include <stdio.h>
    #include <math.h>
    
    double fac(int n)
    {
        double t=1;
        for (int i=n;i>1;i++) // hier müsste doch i-- stehen, oder?
            t*=i;
        return t;
    }
    

    Deine For-Schleife läuft endlos, wenn n grösser als 1 ist.
    Wieso zählst du überhaupt rückwärts? Machs doch von i=1 bis n.

    boenz666 schrieb:

    double Bin(int n,double p,int r)
    {
        double rueckkehrwert;
        rueckkehrwert = fac(n)/(fac(n-r)*fac(r))*pow(p,r)*pow(1-p,n-r); // wieso so kompliziert?
        return (rueckkehrwert);
    }
    

    Wie geloescht schon sagte, braucht man für den Binomialkoeffizienten nur folgende Formel: Binomialkoeffizient(n,k) = n! / (k! * (n-k)!)

    boenz666 schrieb:

    int main ()
    {
        // ...
        f = Bin (n,p,r);
    }
    

    Wo wurde denn p deklariert? Ich versteh nicht genau, was willst du mit p überhaupt? Der Binomialkoeffizient benötigt nur 2 Argumente. Oder was willst du mit der Funktion Bin(..) anstellen?

    boenz666 schrieb:

    return(0);
    

    Noch was, nur damit keine Missverständnisse entstehen: return ist keine Funktion, deshalb sind die Klammern überflüssig. Schreib doch einfach return 0;

    Ich hoffe, ich konnte helfen, wegen meines langen Beitrages wurde inzwischen schon einiges beantwortet 😉



  • Hi Nexus.
    Vielen Dank auch an dich.
    Wie du schon bemerkt hast wurde ja schon einiges beantwortet.
    Wegen return, setze die Klammern halt nur weil der Prof. es so beigebracht hat und ich denke, dass die das dann auch immer so sehen wollen^^
    Wegen i--, dass war schon des Rätsels Lösung. Hatte das auf ++ geändert, weil ich -- noch nicht kannte.
    Ergebnis habe ich nun also danke an euch beide.
    Mit p war halt der Punkt aus dem Netz, der mich verwirrt hatte, keine Ahnung wie das dazu kam?!


Anmelden zum Antworten