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.