Pi-Berechnung durch Zufallspfeilwürfe



  • Hallo!
    Ich habe einen Algorithmus, der pi dadurch berechnet, indem er Pfeilwürfe in einen Vierteleinheitsquadrats zufällig "wirft" und dann das Verhältnis der Pfeilwürfe innerhalb des Vierteleinheitskreises durch die Gesamtanzahl mit dem Verhältnis zwischen der Fläche innerhalb des Vierteleinheitskreises durch das des Quadrats gleichsetzt.
    Das Problem ist nun, dass jedesfall die Zufallszahl so dämlich gewählt werden, dass für Näherungswert von pi 3,8 irgendwas rauskommt. Hier der Code:

    #include <iostream>
    using namespace std;
    #include <cmath>
    
    double hoch(double a,int b)                      
         {
             double c=a; // Zwischenspeichern von a
             if (b==0) // a ^ 0 = 1
             return 1; // ...
             while(b>1) // (b-1)-Mal
             {
                    c*=a; // a ist alstes a Mal erstes a
                    b--;
             }
             return c; // gibt Ergebnis zurück
         }  
    
    /*
    rand()Zahl Stellen rausfinden und 0, machen.
    */
    double zufallszahl(int z)
        {
           int i=0,zneu;
           zneu=z;
           while((zneu/10)>0)
           {
                    zneu=zneu/10;
                    i++;
           }
           double zfinal;
           zfinal=static_cast<double>(z)/static_cast<double>((hoch(10,i+1)));
           return zfinal;
    }
    
    int main()
    {
    	int ipfeilwuerfe,ianzahlin=0,ianzahlout=0;
    	double ipi;
    	double izufallx,izufally;
    	srand(time(NULL));
    	cout<<"\nWieviel Pfeilwuerfe?\n";
    	cin>>ipfeilwuerfe;
    	cin.get();
    	for (int i=1;i<=ipfeilwuerfe;i++)
    	{
        izufallx=zufallszahl(rand());
    	izufally=zufallszahl(rand());
    	if (sqrt(hoch(izufallx,2)+hoch(izufally,2))<=1)
    	{
           ianzahlin++;
           //cout<<izufallx<<" "<<izufally<<" ";cout<<" drinne\n";
        }
        else
        {
            ianzahlout++;
            cout<<hoch(izufallx,2)+hoch(izufally,2)<<"draussen\n";
        }
        }
        ipi=static_cast<double>(4*ianzahlin)/static_cast<double>(ipfeilwuerfe);
        cout<<ipi<<"\n";
        cin.get();
    
    }
    

    Kann mir jemand sagen was da falsch ist?

    Vielen Dank im Voraus
    eginobili20



  • Ich vermute, das die Funktion 'zufallszahl' keine gleichverteilten Zufallszahlen im Intervall [0,1] liefert.
    Versuch' mal so was wie das:

    double zufallszahl()
    {
         int z = rand();
         double zfinal = double( z ) / RAND_MAX;
         return zfinal;
    }
    

    Gruß
    Werner



  • Hallo!
    Vielen Dank für den Tipp!
    Aber warum reicht denn nicht, die Zahl durch 10^Ziffernanzahl zu teilen? Es ist doch trotzdem immer ne random zahl? Durch den Ausdruck /Rand-max wurde es lediglich noch etwas komplizierter gemacht, aber vom Prinzip ist das doch nicht anders, oder?
    Nochmals danke
    Eginobili20



  • Weil damit die erhaltene Zahl nicht mehr gleichmäßig im Interval [0,1] verteilt liegt. rand() liefert eine gleichverteilte Zufallszahl, wenn du einzelne Werte unterschiedlich stark gewichtest, verschiebst du diese Verteilung.


Anmelden zum Antworten