C++ :: Aufgabe #84
2 Lösungen

Berechnen von Pi mit Zufallszahlen
Anfänger - C++
von eulerscheZhl
- 07.03.2015 um 07:58 Uhr
Man kann die Kreiszahl Pi näherungsweise bestimmen, indem man Zufallszahlen generiert:
Man stelle sich einen Kreis mit Mittelpunkt (0/0) und Radius 1 vor. Es werden zufällig Punkte erzeugt, bei denen sowohl x als auch y im Intervall [0;1[ liegen. Dann wird die Entfernung dieser Punkte zum Ursprung ermittelt. Ist diese Entfernung kleiner als 1, so liegt der Punkt innerhalb des Kreises.
Setzt man bei einer ausreichenden Zahl von Zufallspunkten die Zahl der Treffer in das richtigen Verhältnis zur Gesamtzahl der Punkte, so erhält man einen Näherungswert für Pi (Pi = 4 * AnzahlTreffer / AnzahlGesamt).
Schreibe ein Programm, das auf oben beschriebene Weise Pi berechnet.
Man stelle sich einen Kreis mit Mittelpunkt (0/0) und Radius 1 vor. Es werden zufällig Punkte erzeugt, bei denen sowohl x als auch y im Intervall [0;1[ liegen. Dann wird die Entfernung dieser Punkte zum Ursprung ermittelt. Ist diese Entfernung kleiner als 1, so liegt der Punkt innerhalb des Kreises.
Setzt man bei einer ausreichenden Zahl von Zufallspunkten die Zahl der Treffer in das richtigen Verhältnis zur Gesamtzahl der Punkte, so erhält man einen Näherungswert für Pi (Pi = 4 * AnzahlTreffer / AnzahlGesamt).
Schreibe ein Programm, das auf oben beschriebene Weise Pi berechnet.
Lösungen:

#include <iostream> #include <random> #include <utility> #include <cmath> using namespace std; using point_t = pair<float,float>; class random_point_generator { public: point_t operator() () { return make_pair(distribution(engine), distribution(engine)); } private: mt19937 engine; uniform_real_distribution<double> distribution{0.0,1.0}; }; bool point_on_circle (const point_t& point) { return sqrt(pow(point.first, 2) + pow(point.second, 2)) < 1; } double calculate_pi_random(unsigned reps) { unsigned hits = 0; random_point_generator gen; for(unsigned i = 0; i< reps; i++){ if(point_on_circle(gen())) hits++; } return 4 * (static_cast<double>(hits) / reps); } int main() { cout << "Bitte Anzahl an Widerholungen eingeben" << '\n'; unsigned rep; cin >> rep; cout << "PI ist " << calculate_pi_random(rep) << '\n'; }

// Pi mit Zufallszahlen berechnen #include <iostream> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; double Zufallszahl(double, double); int main() { double AnzahlGesamt; cout << "Geben Sie die Anzahl der Versuche an: "; cin >> AnzahlGesamt; cout << endl; cout << "Es werden " << AnzahlGesamt << " Versuche gemacht. Bitte warten!" << endl << endl << endl; double Treffer = 0.0; // Anzahl Zufallspunkte im Kreis double x; // Zufallskoordinate x double y; // Zufallskoordinate y double Abstand; // Abstand zw. Mittelpunkt und Zufallspunkt = sqrt(x^2 + y^2) double pi; srand((unsigned)time(0)); // Zufallsgenerator initialisieren for (int i = 0; i < AnzahlGesamt; ++i) { x = (double) rand() / RAND_MAX; y = (double) rand() / RAND_MAX; Abstand = sqrt(x*x+y*y); if (Abstand <= 1) { Treffer = Treffer + 1; } } pi = 4 * Treffer / AnzahlGesamt; cout << "pi lautet nach " << AnzahlGesamt << " Versuchen: " << pi << endl; return 0; }