Durchschnittswert berechnen



  • Hi,

    ich bin gerade dabei den Durchschnittswerte bei einem Würfel zu simulieren. Wenn ich würfle und keine 6 erhalte muss ich aufhören und der Wert wird zurückgegeben. Wenn ich allerdings eine 6 Würfle kann ich nochmals würfeln- Bis ich keine 6 mehr würfle. Ich versuche dies zu simulieren und den Durchschnittswert aus 100 durchläufen zu berechnen. Hier ist mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int roll() {
        int num = 0;
        double result = 0;
        while (1) {
            int z = rand() % 6 + 1;
            if (z == 6) break;
            num++;
            result += z/num;
            printf("%d\n", z);
        }
        return result;
    }
    
    int main() {
        srand(time(NULL));
        const int reps = 100;
        int sum = 0;
        for (int i = 0; i < reps; ++i)
            sum += roll();
        printf("%f\n", (double)sum / reps);
        return 0;
    }
    
    

    Allerdings scheint es so zu sein dass mein Code die Zahl 6 nicht miteinberechnet. Allerdings bin ich mir da nicht sicher. Kann mir jemand helfen? thx.



  • @jasmin89 Naja, guck mal in deine roll() Funktion. Was macht die Funktion denn, wenn das Ergebnis 6 ist? Und was steht dann in result.



  • Naja Wenn die Zahl 6 vorhanden ist wird die Funktion nochmals ausgeführt bis keine 6 mehr vorhanden ist. Die Summe wird dann durch die Anzahl der Durchläufe dividiert und in result ausgegeben.

    Aber ich glaube dass dort die 6 nicht mit hinzugezählt wird. Bin für einen Tipp dankbar.



  • @jasmin89 sagte in Durchschnittswert berechnen:

    if (z == 6) break;

    Nicht glauben, wissen ist die Kunst des Programmierens. Mit breakverlässt du die Schleife. Was dein Code macht ist: Solange würfeln, bis eine 6 gewürfelt ist, dann abbrechen, die 6 aber nicht mitzählen. Die anderen Zahlen werden irgendwie komisch gewichten, je später sie kommen, desto weniger zählen sie.



  • @jasmin89
    Mache deine Kontroll-printf vor dem break, da solltest du dann klarer sehen.



  • Außerdem ist deine Berechnung des Durchschnitts falsch!
    Du rechnest:

    result = z1 / 1 + z2 / 2 + z3 / 3 + ...
    

    Das ist aber nicht:

    result = (z1 + z2 + z3 + ...) / num
    


  • @Schlangenmensch sagte in Durchschnittswert berechnen:

    @jasmin89 sagte in Durchschnittswert berechnen:

    if (z == 6) break;

    Solange würfeln, bis eine 6 gewürfelt ist, dann abbrechen, die 6 aber nicht mitzählen. Die anderen Zahlen werden irgendwie komisch gewichten, je später sie kommen, desto weniger zählen sie.

    Genau das möchte ich nicht. Ich möchte eben einmal Würfeln dann gucken ob die Zahl 6 ist, wenn nicht Zahl ausgeben, wenn Zahl 6, dann nochmals würfeln:

    int roll() {
        int num = 0;
        double result = 0;
        while (1) {
            int z = rand() % 6 + 1;
            result += z;      
            if (z != 6) break;      // Wenn Zahl nicht 6 dann ausgeben
            num++;
            result += result = (+z) / num;
        }
        return result;
    }
    


  • @jasmin89 sagte in Durchschnittswert berechnen:

    result += result = (+z) / num;

    Bist du dir sicher, dass du weißt, was die Zeile tut?
    Was soll die Funktion zurück geben, wenn eine 6 Gewürfelt wird? Was wenn zwei 6en gewürfelt werden?



  • Also du hast irgendein Random Programm geschrieben, das nichts mit der Aufgabe zu tun hat und dann wunderst du dich, das Ergebnis und Aufgabe nicht zueinander passen. Hmm, warum nur?



  • Ach.... Ich habe die Funktion nochmals neu gemacht: Tja das kommt als Anfänger mal vor 😉

    int roll() {
        int result = 0, z;
        do {
            z = rand() % 6 + 1;
            result += z;
        } while (z == 6);
        return result;
    }
    
    
    

    Bin aber nicht sicher. Daher bin ich für eine kleine Unterstützung dankbar 🙂



  • @jasmin89 Wo bist du dir denn nicht sicher? Auf den ersten Blick sieht das erstmal gut aus.



  • @jasmin89 Das sieht richtig aus!



  • @Schlangenmensch sagte in Durchschnittswert berechnen:

    @jasmin89 Wo bist du dir denn nicht sicher? Auf den ersten Blick sieht das erstmal gut aus.

    Naja wenn ich das ganze ding nun in der main() simuliere, bin ich nicht ganz sicher ob der Durchschnittswert so korrekt ist. Mein Gedanke war dass ich vill. schon in der Funktion roll den Durchschnittswert berechnen sollte (aus der summe der Zahlen und den anzahl der durchläufen). Dann müsste ich in der main() die errechneten Durchschnittswerte aufsummieren und durch die Anzahl 100 dividieren.
    Aber vill. ist da mein Gedankengang einfach nur falsch



  • @jasmin89
    Das hängt halt von der Aufgabenstellung ab. Wenn der Durchschnittswert über alle Würfelwürfe gemacht werden soll und 7 (6+1) als zwei Würfe zählen, dann musst du den Durchschnitt wirklich über alle Würfe bilden. Wenn die 7 aber nur als ein Wurf zählt, dann darf er auch nur als ein Wurf gezählt werden.


Log in to reply