Programmieraufgabe - habe keine Ahnung


  • reny
  • 1441 Aufrufe 11 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Programmieraufgabe - habe keine Ahnung

    Hi ich brauche eure Hilfe kann mir vllt. jemand bei folgender Übungsangabe helfen danke


    Aufgabe 1.
    Schreib ein Programm, das den Wert von pi mit der Monte{Carlo Methode berechnet.
    Dazu wird in einer Schleife hunderttausend Mal jeweils ein Zahlenpaar x und y zwischen
    0 und +1 mit der Random{Klasse erzeugt. Sodann wird uberpruft,ob ein Punkt mit den Koordinaten
    x; y innerhalb eines Kreises mit dem Radius r = 1 liegt oder nicht. Der Prozentsatz der
    innerhalb des Kreises liegenden Zahlenpaare gibt die Zahl =4 an.


    Anleitung: denk an den Satz von Pythagoras. x und y spannen
    ein rechtwinkeliges Dreieck auf. Der Radius des Kreises soll 1 betragen.
    Wir uberprufen nun, ob der Punkt (x; y) innerhalb des Kreises
    oder ausserhalb liegt. Da wir x und y zwischen 0 und 1 im ersten
    Quadranten betrachten errechnen wir nur die Flache eines
    Viertelkreises. Deshalb mussen wir das Ergebnis mit 4 multiplizieren
    um die Flache des gesamten Kreises (und damit , da
    sich die Kreis
    ache ja zu r^2*pi ergibt) zu erhalten




    ACHTUNG: Text wurde kopiert
    xnuıl feel free
    ǝlddɐ feel different
    sʍopuıʍ feel bad

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von reny ()

  • Wobei genau sollen wir dir helfen? Die Aufgabe steht dort... Eine komplette Lösung wirst du (zumindest von mir) nicht bekommen...

    Mein Tipp:
    Anfangen die Aufgabe zu lösen (z.B. google nach Monte Carlo Methode befragen und versuchen das zu verstehen). Wenn du den algorithmus verstehst versuch ihn umzusetzen. Wenn du dann probleme hast hilft dir sicher jemand weiter...

    P.s. falsches Forum...
    P.p.s. Wie man Fragen richtig stellt.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Also,

    Zerd hatte schon recht. In aller regel nutzt man dann google mit Monte Carlo und sollte sogar dann sofort auf ne fertige implementierung stossen.
    Ich hab das jetzt mal nicht gemacht sondern nur den Text gelesen und wenn man sich ein Blatt Papier nimmt und nen Stift und das mal aufzeichnet kommt man mit bischen überlegen schon recht schnell dahinter wie die Idee des Monte Carlo ist.
    Zeichne dir einfach mal nen Einheitskreis auf.
    Dann zeichnest dir nen Dreieck rein und nen Quadrat.
    Ich hab das mal hier exemplarisch gemacht.

    Und jetzt wird es schon langsam klar wies läuft wenn man sich schrittweise drüber Gedanken macht.
    Es werden halt jetzt Punkte innerhalb dieses Quadrates zufällig ausgewählt. Und dann wird überprüft ob der Punkt im Kreis oder draußen liegt.
    Wie geht das?
    Ganz einfach, mit dem Pythargoras. Steht ja im Text.
    Was bei den Dreiecken auffällt ist das die Dreiecke genau auf dem Kreis eine Seite mit der länge vom Radius haben.
    Schauen wir uns den Satz an.
    a^2 + b^2 = c^2
    a = x
    b = y
    und c = r = 1 !!
    also können wir jetzt zu jedem Punkt sagen ob er drinnen oder draußen liegt.
    Weil x^2+y^2 <= 1 -> punkt im Kreis und x^2 + y^2 > 1 -> Punkt draußen.
    So und das macht man jetzt für nen riesen Anzahl von punkten. Und merkt sich wieviele nun innerhalb des Kreises lagen und wieviele draußen. Da kann man sich dann nen Prozentsatz ausrechnen.
    Wie bestimmt man jetzt mit dem Prozentsatz Pi?
    Ganz einfach, wir erweitern diesen Viertelkreis auf einen ganzen, und das quadrat auf größeres das den ganzen Kreis umspannt.
    Das Quadrat hat somit dann die Fläche von 4 (seitenlänge 2)
    Und die Fläche vom Kreis ist = r^2* Pi
    r = 1 also ist die Fläche = Pi und die Fläche ist eben 4 * Prozentsatz.
    Damit ist Pi = 4 * Prozentsatz.
    Und das wars. :)

    Gott bin ich stolz auf mich das ich das ohne google rausgefunden hab ^^
    Nur die Formel vom Kreis hab ich nachgeschlagen zur Sicherheit hehe.
    So und das ganze jetzt noch in Code gießen ist ne leichte Übung ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von stelzi ()

  • PHP-Quellcode

    1. public class Main {
    2. /**
    3. * @param args
    4. */
    5. public static void main(String[] args) {
    6. double incirc = 0.0;
    7. double outcirc = 0.0;
    8. for (int i = 0; i < 100000; i++) {
    9. double x = Math.random();
    10. double y = Math.random();
    11. if ((x * x + y * y) <= 1.0)
    12. incirc++;
    13. else
    14. outcirc++;
    15. }
    16. double percent = 0.0;
    17. percent = incirc / (incirc + outcirc);
    18. System.out.println("Pi ist: " + 4 * percent);
    19. }
    20. }
    Alles anzeigen


    Es gibt da schon noch so ein paar mögliche Diskussionspunkte. z.b. liefert Math.random() nur Zahlen von 0(einschliesslich) bis 1 (ausschliesslich) und eigentlich bräuchte man 0(einschliesslich) bis 1 (einschliesslich).
    Auch ist die Frage was ist mit den Punkte die exakt auf dem Kreis liegen, zählen die als im Kreis oder als aus dem Kreis? :)
    Das sind so Feinheiten die man eigentlich noch klären müsste. Aber ein halbwegs passables Ergebnis kommt schon dabei raus. Um die Genauigkeit zu erhöhen musst du nur die Schleife länger laufen lassen.
  • kann wir jemand schreiben ob das falsch oder richtig ist
    wenn es falsch ist kann es derjenige bitte verbessern danke.

    Java-Quellcode

    1. import java.util.Random;
    2. public class montecarlo_ue1 {
    3. static int zufallsZahl(int a, int b){
    4. Random r=new Random();
    5. int erg=r.nextInt(b-a+1);
    6. return erg;
    7. }
    8. static int zufallsZahl2(int a, int b){
    9. Random r=new Random();
    10. int erg=r.nextInt(b-a+1);
    11. return erg;
    12. }
    13. /**
    14. * @param args
    15. */
    16. public static void main(String[] args) {
    17. // TODO Auto-generated method stub
    18. int anz=0;
    19. for(int i=1;i<=100000;i++){
    20. int x=zufallsZahl(0,1);
    21. int y=zufallsZahl2(0,1);
    22. int wurz=x*x+y*y;
    23. double erg=Math.sqrt(wurz);
    24. double end=wurz*4;
    25. if(wurz<=1){
    26. anz=anz+1;
    27. }
    28. }
    29. System.out.println("Die Anzahl beträgt "+anz);
    30. }
    31. }
    Alles anzeigen
    xnu&#305;l feel free
    &#477;ldd&#592; feel different
    s&#653;opu&#305;&#653; feel bad