Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

VC++ & PI & Monte-Carlo-Variante

(Anonym) / 4 Antworten / Baumansicht Nickles

Ich habe vor, PI per Monte-Carlo-Methode zu berechnen. Aber leider weiß ich nicht genau, wie ich abrfagen soll, ob der Punkt im Kreis oder außerhalb liegt.

bei Antwort benachrichtigen
(Anonym) Nachtrag zu: „VC++ & PI & Monte-Carlo-Variante“
Optionen

Viel Spaß beim portieren nach C++!!

//-------------------------------------------------------------------
iseed = 42
10 RANDOMIZE TIMER
quadrat = 0
kreis = 0

CLS
SCREEN 0
INPUT "Anzahl der Punkte : ", n
CLS
SCREEN 12
WINDOW SCREEN (0, 0)-(2!, 2! / 1.33333333#)
LINE (0, 0)-(1, 0)
LINE (1, 0)-(1, 1)
LINE (1, 1)-(0, 1)
LINE (0, 1)-(0, 0)
CIRCLE (.5, .5), .5
FOR i = 1 TO n
LOCATE 10, 60
PRINT "Punkt Nr. "; i
x = RND(iseed)
y = RND(iseed)
REM *
REM * Mit dem Satz von Pythagoras wird ueberprueft ob sich der
REM * Punkt (x,y) innerhalb des Kreises liegt oder nicht:
REM * Der Ursprung des Koordinatensystems liegt im Mittelpunkt
REM * des Kreises mit den Koordinaten (0.5,0.5). Der Radius
REM * des Kreises ist 0.5 .
REM *
IF SQR((x - .5) ^ 2 + (y - .5) ^ 2) kreis = kreis + 1
PSET (x, y), 3
ELSE
PSET (x, y), 2
END IF
LOCATE 12, 60
pi = 4 * kreis / i
PRINT "pi = "; pi; " "
NEXT i
quadrat = n
LOCATE 22, 1
PRINT " kreis = ", kreis
PRINT "quadrat = ", quadrat
ratio = kreis / quadrat
pi = 4! * ratio
PRINT "Kreisflaeche/Quadratflaeche = ", ratio
PRINT " * 4 = pi = ", pi
PRINT " exakter Wert fuer pi = 3.1415..."

INPUT dummy
IF dummy = 1 GOTO 20
GOTO 10
20 SCREEN 0

END
//-------------------------------------------------------------------

bei Antwort benachrichtigen
Andy 386 (Anonym) „Viel Spaß beim portieren nach C !!...“
Optionen

Aha.
ist das Batch?
(wegen rem & cls)

bei Antwort benachrichtigen
Dreamforger (Anonym) „VC++ & PI & Monte-Carlo-Variante“
Optionen

Monte Carlo Methode?
Du meinst zufällige Punkte (Regentropfen) in ein Einheitsquadrate 'tropfen' lassen und aus dem verhältinis der Treffer/ Gesamt PI folgern?

Kurzantwort:
Über die Entfernung zum Kreismittelpunkt!

Langantwort:
Ok du hast ein Quadrat mit Seitenlänge 1 in dessen eine Ecke der Mittelpunkt eines Kreises mit Radius 1 ist. Eine Quadratseite nennst du X die andere Y. Den Kreis legst du in (X;Y) = (0,0) an.

Ob ein Punkt (X;Y) = ([0,1];[0,1]) im Kreis liegt kannst du über die Entfernung des Punkts zum Mittelpunkt des Kreises (0;0) feststellen.
Die Entfernung r eines Punktes (x;y) vom Kreismittelpunkt ist


sqrt(x*x + y*y);


Für r Für r = 1 liegt der Punkt auf der Kreislinie *
Für r > 1 liegt der Punkt ausserhalb des Kreises

Meines Wissens werden die mit * gekennzeichneten Fälle zusammengefasst zu den Erfolgsfällen.

Ein Kreis mit Radius 1 hat die Fläche PI. Da du hier aber nur auf ein Kreisviertel getropft hast ist auch die Erfolgsfläche PI/4.

Das Verhältnis der Erfolgsfälle zu den Gesamttropfen ist dasselbe wie das Verhältnis der Erfolgsfläche zum Quadrat:


Erfolg PI
-------- = ------
Gesamt 4* 1


4* Erfolg
PI = -------------
Gesamt


Meld' dich einfach wenn ich das ganze noch in C++ Code verpacken soll

CU
Dreamforger

bei Antwort benachrichtigen
Andy 386 Dreamforger „Monte Carlo Methode? Du meinst zufällige Punkte Regentropfen in ein...“
Optionen

Naja, es ist eigentlich nur
> sqrt(x*x + y*y);
was gibt das denn zurück, wenn der Punkt außerhalb/im Kreis ist?
Und zum Rest:
erfolg/gesamtanz. = 4*PI

bei Antwort benachrichtigen