C - Computer Zufallszahlen

jack_1

Mitglied
Hi,

ich bin gerade dabei ein Programm zu schreiben das wie folgt ablaufen sollte:


Der Computer soll eine Zahl würfeln, wenn er eine 6 gewürfelt hat kann er nochmals würfeln. Der PC kann dabei so lange weiterwürfeln bis er keine 6 mehr gewürfelt hat. Zuletzt werden die gewürfelten Punkte aufsummiert.


[CODE lang="c" title="C"] #include <stdio.h>
#include <stdlib.h>
#include <time.h>

int roll(void)
{
return (rand() % 6) + 1; // Funktion zur generierung von Zufallszahlen
}

int summe( int a ) { // Werte aufsummieren
return ( a+a );
}


int main()
{ srand(time(NULL));

int i = roll(); // Zufallszahl berechnen


if (i < 6) { // Wenn Zahl kleiner als 6 berechnete Zahl ausgeben
printf("gewuerfelte Zahl = %d\n", i);}

else { // Wenn Zahl 6 dann nochmals würfeln
int i = roll();}


if (i < 6) {

summe(i);
printf("gewuerfelte Zahl = %d\n", i);
}

return 0;
}


[/CODE]

Das Programm gibt mir nur die Zufallszahl aus aber nicht die aufsummierte Summe. Ich komme hier nicht weiter und vielleicht kann mir hier ja jemand helfen.
 
K

kneitzel

Gast
Das kann ja auch so nicht klappen. Die Methode summe nimmt einen Parameter und gibt einfach den doppelten Wert aus. Du rufst summe auf, aber das Ergebnis ignorierst Du...

Dann ist das, was Du da im Text formuliert hast, doch eine Schleife. Aber im Code ist keine Schleife.

Wenn Du die Summe aller Würfe haben möchtest, dann brauchst du dafür erst einmal eine Variable Nach dem würfeln kannst Du die gewürfelte Zahl hinzu addieren.
 

jack_1

Mitglied
Ok, danke für deine Antwort. Ich habe versucht deine Tipps in dem Code zu ändern.

Für die Funktion summe habe ich zur Variable a die Berechnete Zahl hinzuaddiert: Bin nicht ganz sicher ob das so stimmt:
Gibt es da in C nicht bereits eine funktion dass mir die Summe berechnet?
[CODE lang="c" title="Sum"] int summe( int a ) { // Werte aufsummieren
return ( a+"%d" );
}[/CODE]


Hier mein gesamter Code:
C:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int roll(void)
    {
        return (rand() % 6) + 1;                    // Funktion zur generierung von Zufallszahlen
    }

    int summe( int a ) {                            // Werte aufsummieren
    return ( a+"%d" );
    }


    int main()
    { srand(time(NULL));

        int i = roll();                             // Zufallszahl berechnen
        int a=i;                                    // Zufallszahl in Variable speichern

        for(i = i; i <6; roll()){                   // Wenn Zahl kleiner als 6 berechnete Zahl ausgeben
        a = a+i;                                    // Gewürfelte Zahl in Variable speichern
        if (i < 6) {
            printf("gewuerfelte Zahl = %d\n", i);}

        else  {                                     // Wenn Zahl 6 dann nochmals würfeln
        int i = roll();}
        a = a+i;                                    // Gewürfelte Zahl in Variable speichern

        if (i < 6)                                  // Wenn danach Zahl kleiner als 6 dann nicht mehr würfeln
        a = a+i;
        break;                                      // Schleife verlassen wenn Zahl kleiner 6

        summe(i);
        printf("gewuerfelte Zahl = %d\n", i);
        }

        return 0;
    }

Aber hier wird mir dennoch nicht die Summe ausgegeben. Da habe ich noch irgendwo einen Fehler.
 
K

kneitzel

Gast
Eine Summe ist doch die Addition von zwei Zahlen. Also brauchst du erst einmal zwei Zahlen, die du addieren möchtest.
Und da kommt dann auch eine Zahl raus - mit der sollte also auch etwas passieren. Wenn du mit der Summe nichts machen möchtest, dann musst du diese auch nicht berechnen.

Geh doch einfach ein Beispiel durch und sag immer, was die Summe an der Stelle ist wenn sie sich verändert, dann schreib auf, wie du sie verändert hast.

Und in Deinem Code ist auch weiterhin keine Schleife. Daher kannst du auch keine Schleife verlassen,... Schleifen wären in C z.B. mittels for oder while.
http://openbook.rheinwerk-verlag.de...en_008.htm#mj8641c07f2748ff8cd4d02dce2c4bff70 wäre while und die for Schleife findet sich im folgenden Kapitel.
 

jack_1

Mitglied
Ok, ich habe es versucht wie laut dem Link von dir umzusetzen. Ich habe es oft probiert aber ich bekomme leider kein Ergebnis.

C:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int roll(void)
    {
        return (rand() % 6) + 1;                    // Funktion zur generierung von Zufallszahlen
    }

    int summe( int a, int b ) {                            // Werte aufsummieren
    return ( a + b  );
    }


    int main()
    { srand(time(NULL));
        int a; int b, summe=0;                              // Variabeln


        while(1){                                   // While Endlosschleife
        int i = roll();                             // Zufallszahl berechnen
        scanf("%d", &a);                            //Zufallszahl in Variable a speichern

        if (a < 6)                                  // Wenn gewürfelte zahl a kleiner als 6 dann Wert zurückgeben
            printf("gewuerfelte Zahl = %d\n", a);

        else
        i = roll();                                 // Wenn Zahl 6 vorhanden ist dann nochmals würfeln
        scanf("%d", &b);                            // Gewürfelte Zahl in Variable b speichern

        if (b < 6)                                  // Wenn danach Zahl kleiner als 6 dann nicht mehr würfeln

        break;
        summe+=a , b;
        }


    printf("Summe der gewuerfelte Zahlen = %d\n", summe);


    return 0;
}
 
K

kneitzel

Gast
Also das sieht schon einmal etwas besser aus, auch wenn da jetzt noch ein paar Dinge sind, die so natürlich falsch sind.

C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int roll(void)
{
    return (rand() % 6) + 1;                    // Funktion zur generierung von Zufallszahlen
}

int summe( int a, int b )
{       
    return ( a + b  );
}

int main()
{
    srand(time(NULL));
    int a; int b, summe=0;                              // Variabeln

    while(1)
    {
        int i = roll();                             // Zufallszahl berechnen

        // Was genau willst Du hier machen? Die Zufallszahl ist doch in i!
        // Wenn Du diese auch in a haben möchstest, dannreicht ein a = i;
        scanf("%d", &a);                            //Zufallszahl in Variable a speichern

        if (a < 6)                                  // Wenn gewürfelte zahl a kleiner als 6 dann Wert zurückgeben
            printf("gewuerfelte Zahl = %d\n", a);
        else
            i = roll();                                 // Wenn Zahl 6 vorhanden ist dann nochmals würfeln

        // hier fehlen evtl { } - soll das nur beim else laufen?
        // Ansonsten gilt hier das gleiche wie schon oben ...
        scanf("%d", &b);                            // Gewürfelte Zahl in Variable b speichern
        if (b < 6)                                  // Wenn danach Zahl kleiner als 6 dann nicht mehr würfeln
        break;

        // Das geht so nicht. Du kannst summe aufrufen oder direkt summieren ...
        summe+=a , b;
    }
    printf("Summe der gewuerfelte Zahlen = %d\n", summe);
    return 0;
}

Also was Du machen willst ist doch:
- Solange Würfeln, bis Du eine 6 hast.
- Jeder Wurf wird aufaddiert und wird ausgegeben.
- Am Ende wird die Summe ausgegeben.

Da gebe ich Dir einfach einmal eine Lösung vor:

Wichtig ist, dass Du aber als erstes die Überlegung im Text verstehst. Was genau machst Du? Also hier wirklich die Situation vor Augen führen: Du hast einen Würfel. Du würfelst und dann errechnest Du erst die neue Summe aus der alten + der Würfelzahl.
Dann schaust Du, ob du eine 6 gewürfelt hast, denn dann würdest Du aufhören und das Ergebnis verkünden ...

C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int roll(void)
{
    return (rand() % 6) + 1;                    // Funktion zur generierung von Zufallszahlen
}

int main()
{
    srand(time(NULL));
    int summe=0;  // Summe 
    int wuerfelZahl = 0; // gewürfelte Zahl
    do {
        int wuerfelZahl = roll();   // Neue zahl würfeln
        summe += wuerfelZahl; // Die neue Summe wird um die gewürfelte Zahl erhöht.
        printf("Gewuerfelte Zahl = %d\n", a);
    }  while(wuerfelZahl != 6)
    printf("Summe der gewuerfelte Zahlen = %d\n", summe);
    return 0;
}
 

jack_1

Mitglied
Hallo, vielen dank für deine Hilfe.

Ich habe den Code noch etwas ausgebessert da dort die Variable a vorkam. Und nach while, glaube ich, fehlte noch ein ;

Java:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int roll(void)
{
    return (rand() % 6) + 1;                    // Funktion zur generierung von Zufallszahlen
}

int main()
{
    srand(time(NULL));
    int summe=0;  // Summe
    int wuerfelZahl = 0; // gewürfelte Zahl
    do {
        int wuerfelZahl = roll();   // Neue zahl würfeln
        summe += wuerfelZahl; // Die neue Summe wird um die gewürfelte Zahl erhöht.
        printf("Gewuerfelte Zahl = %d\n", summe);
    }  while(wuerfelZahl != 6);
    printf("Summe der gewuerfelte Zahlen = %d\n", summe);
    return 0;
}

Das klappt gut. Ich stelle mir die Frage ob ich das ganze Paket in eine Funktion geben kann, damit ich diese wieder leicht verwenden kann. Ich habe die Ausgabe mittels printf mal weggelassen und die Ausgabe als return summe angegeben. Würde das mit meinen Befehl return summe; so passen?


C:
int croll(void)
{
    srand(time(NULL));
    int summe=0;  // Summe
    int wuerfelZahl = 0; // gewürfelte Zahl
    do {
        int wuerfelZahl = roll();   // Neue zahl würfeln
        summe += wuerfelZahl; // Die neue Summe wird um die gewürfelte Zahl erhöht.
    }  while(wuerfelZahl != 6);

    return summe;
}
 

jack_1

Mitglied
Ich habe nun versucht dies als Funktion in eine main einzubauen. Es sollen 100 durchläufe gemacht werden, und die Zahlen aufsummiert werden. Allerdings bekomme ich immer nur die gleiche Zufallszahl anstatt jedes mal eine andere...

C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int roll(void)
{
    return (rand() % 6) + 1;                    // Funktion zur generierung von Zufallszahlen
}


int croll(void)
{
    srand(time(NULL));
    int summe=0;  // Summe
    int wuerfelZahl = 0; // gewürfelte Zahl
    do {
        int wuerfelZahl = roll();   // Neue zahl würfeln
        summe += wuerfelZahl; // Die neue Summe wird um die gewürfelte Zahl erhöht.
        printf("Gewuerfelte Zahl = %d\n", summe);
        return summe;
    }  while(wuerfelZahl != 6);
    return summe;
        printf("Summe der gewuerfelte Zahlen = %d\n", summe);


}


int main() {
  srand(0);
  int sum = 0;
  int steps = 100;
  for (int i = 0; i < steps; i++)
    sum += croll();
  printf("%f\n", (double)sum );
}
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Die Zufallszahlen werden über einen Algorithmus berechnet. Man kann aber den Startpunkt vorgeben und dann werden immer die gleichen Zufallszahlen gezogen...
Daher ist eine Initialisierung wie du sie gemacht hast einfach nur Unsinn.
 

fhoffmann

Top Contributor
In croll() initalisierst du den Zufallszahlengenerator immer neu mit srand(time(NULL));. Da dein Programm aber so schnell ist (deutlich weniger als eine Sekunde benötigt), startest du den Zufallszahlengenerator (fast) immer mit der gleichen Zahl (Zeit).
Du solltest stattdessen das srand(time(NULL)); einmalig in der main() aufrufen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Computer per bat-Datei herunterfahren Andere Programmiersprachen 1

Ähnliche Java Themen

Neue Themen


Oben