Fehler im Prog



  • HI,
    hab n Programm geschrieben, dass über Zufallszahlen die Zahl Pi berechnet.
    Allerdings funktioniert der Zufallsgenerator nicht so wie er soll.
    Hier der Code, wäre toll, wenn ihr mir helfen könntet.

    Code:

    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    #include <ctime>

    using namespace std;

    int main (int argc, char * const argv[])
    {double zahlx, zahly,betrag,erg;
    int anzahl,b=0,kreis=0,nkreis=0;
    cout << "\nBitte eingeben wie oft die Schleife durchlaufen werden soll";
    cin >> anzahl;

    while (b<anzahl) //Genauigkeit
    {
    b++; //b wird pro durchlauf um eins erhoeht

    //x-koordinate
    srand((unsigned)time(NULL));
    zahlx=rand();
    zahlx*=1.0; //mit 1.0 multipliziert
    zahlx/=RAND_MAX;

    //y-koordinate
    zahly=rand();
    zahly*=1.0;
    zahly/=RAND_MAX;

    betrag=sqrt(pow(zahlx,2)+pow(zahly,2)); //betrag des zufallvektors oder länge des vektors
    if (betrag>1) //wenn vektor außerhalb des kreises liegt
    {
    nkreis++;
    }

    else //wenn vektor im kreis liegt also |v|<=1 ist
    {
    kreis++;
    }

    }

    erg=(4*nkreis)/kreis;

    cout << "\nIhr Ergebnis fuer die Annäherung an die Zahl Pi:\n" << erg;

    return 0;
    }



  • 1. Benutze bitte die Code Tags...

    2. Fehlermeldung? Oder einfach falsches Ergebnis? Wie wärs mit mehr Infos? Aus "Funzt nicht wie er soll" wird man hier leider nicht sonderlichs schlau.



  • #include <iostream>
    #include <cstdlib>
    #include <cmath>
    #include <ctime>
    
    using namespace std;
    
    int main ()
    {
            unsigned int anzahl,kreis=0;
            /*
             * Nur einmal initalisieren!
             * Du hattest es in der Schleife
             */
            srand((unsigned)time(NULL));
            cout << "Bitte eingeben wie oft die Schleife durchlaufen werden soll" << endl;;
            cin >> anzahl;
    
            /*
             * Eine for Schleife macht sich hier besser
             */
            for (unsigned int b= 0; b<anzahl; ++b) //Genauigkeit
            {
    
                    /*
                     * So solltest du bessere Zufallswerte erhalten
                     */
                    double zahlx=rand()/((double)RAND_MAX+1);
                    double zahly=rand()/((double)RAND_MAX+1);
    
                    /*
                     * Pow ist hier ok, IMHO aber unnötig -> langsam
                     */
                    double betrag=sqrt(zahlx*zahlx+zahly*zahly); //betrag des zufallvektors oder länge des vektors
                    if (betrag<=1) //wenn vektor im Kreis liegt
                            kreis++;
    
            }
    
            /*
             * Hier darauf achten die Werte nach double zu casten!
             * Und den richtigen Algorithmus verwenden :-)
             * http://www.paswiki.de/index.php/Pi_per_Monte-Carlo
             */
            double erg=(4.0*kreis)/(double)anzahl;
    
            cout << "Ihr Ergebnis fuer die Annäherung an die Zahl Pi: " << erg << endl;
    
            return 0;
    }
    


  • ok, vielen dank!!!!
    aber erklär mir doch bitte noch kurz:
    zeile 28:

    double zahlx=rand()/((double)RAND_MAX+1);
    

    du sagst: zahlx ist zufallszahl durch rand_max
    oder wie versteh ich das jetzt?
    ist rand_max nicht ein fester wert? muss ich den vorher noch deklarieren,ja?

    zeile 45:

    double erg=(4.0*kreis)/(double)anzahl;
    

    wenn du mit 4.0 multiplizierst wandelst du die integer-variable kreis in ne gleitkommazahl um, richtig?

    Dank, warst mir auf jeden ne große Hilfe!!!!



  • Xands schrieb:

    zeile 45:

    double erg=(4.0*kreis)/(double)anzahl;
    

    wenn du mit 4.0 multiplizierst wandelst du die integer-variable kreis in ne gleitkommazahl um, richtig?

    Dank, warst mir auf jeden ne große Hilfe!!!!

    nein, double erg wandelt das schon um!



  • ggggggler schrieb:

    nein, double erg wandelt das schon um!

    Dann wäre es aber bereits zu spät, wenn in int gerechnet und das Ergebnis nach double konvertiert würde.



  • Xands schrieb:

    ok, vielen dank!!!!
    aber erklär mir doch bitte noch kurz:
    zeile 28:

    double zahlx=rand()/((double)RAND_MAX+1);
    

    du sagst: zahlx ist zufallszahl durch rand_max
    oder wie versteh ich das jetzt?
    ist rand_max nicht ein fester wert? muss ich den vorher noch deklarieren,ja?

    RAND_MAX ist ein fester Wert - genau gesagt, ist das dder Maximalwert, den rand() zurückliefern kann. Den mußt du nicht deklarieren, der steht bereits in der <cstdlib>.
    (und durch diese Division skalierst du deinen Zufallswert auf das Intervall [0,1[)



  • dessen bin ich mir schon bewusst.
    Aber warum dann ...(double)RAND_MAX
    und warum RAND_MAX+1

    ?



  • Ohne das +1 wäre im Endergebnis die 1 enthalten. Also ohne hat man [0,1] und mit [0,1[



  • "*(double)*RAND_MAX" sorgt dafür, daß die Gleitkomma-Arithmetik ihre Arbeit aufnehmen kann (sowohl die Rückgabe von rand() als auch die Konstante RAND_MAX sind Ganzzahlen - und bei ganzzahliger Division würdest du etwas unerwartete Resultate erhalten), "+1", um ein nach oben offenes Intervall zu erhalten (die Auswirkungen davon sind eher minimal).



  • Achja,

    mit (rand()+1)/((double)(MAX_RAND+1)) bekommst du ]0,1]
    mit (rand()+1)/((double)(MAX_RAND+2)) bekommst du ]0,1[

    Falls du etwas davon brauchst.


Log in to reply