Pi per Monte-Carlo Turbo Pascal
aus Paswiki Turbo Pascal, der freien Wissensdatenbank
Beschreibung
Dieses Programm, in Turbo Pascal geschrieben, ermittelt die irrationale Zahl Pi rechnerisch und grafisch mit dem Monte-Carlo-Algorithmus.
Erklärung
Der Monte-Carlo-Algorithmus ist ein Algorithmus, d.h. ein Lösungsschema, bei dem mit Zufallszahlen gearbeitet wird.
Hier werden Zufallszahlen zwischen auf 0 und 1 erzeugt ( zur grafischen Verdeutlichung jeweil mit 400 multipliziert ) und als Punktkoordinaten gedeutet.
Diese Zufallszahlen liegen in einem Quadrat mit den Gegenecken (0/0) und (1/1).
Für jeden Punkt wird nun berechnet, ob er im Quadrat ( immer der Fall ) oder auch im Kreis liegt.
Weil der Zufall auf lange Sicht kein Gebiet im Quadrat bevorzugt, verhält sich die Anzahl der Punkte im Viertelkreis ( hier mk ) zur Anzahl der Punkte im Quadrat ( hier mq ) wie der Inhalt des Viertelkreises zum Inhalt des Quadrats :
mk / mq = 0.25*pi / 1 => pi = 4 * mk / mq
Programm
program monte_carlo_pi;
{$N+}
uses graph,crt;
var x,y,mq,mk,p:extended; i,v,anz,anz2:longint; trei,modus:integer; s:string;
begin
trei:=detect;
initgraph(trei,modus,'');
directvideo:=false;
settextstyle(1,horizdir,2);
outtextxy(10,10,'Anzahl der Zufallspunkte ?');
gotoxy(1,3);
readln(anz);
writeln;
outtextxy(10,50,'Anzahl der Durchlaeufe ?');
gotoxy(1,6);
readln(anz2);
cleardevice;
line(50,0,50,460);
line(0,450,650,450);
line(450,50,450,450);
line(50,50,450,50);
circle(50,450,400);
settextstyle(0,horizdir,1);
randomize;
for v:=1 to anz2 do
begin
if v>1 then readkey;
cleardevice;
gotoxy(3,12);write(v,'.');
outtextxy(180,460,'fortlaufend Taste druecken');
line(50,0,50,460);
line(0,450,650,450);
line(450,50,450,450);
line(50,50,450,50);
circle(50,450,400);
mk:=0; mq:=0;
for i:=1 to anz do
begin
y:=random;
x:=random;
if (sqr(x)+sqr(y))<=1 then begin mk:=mk+1;mq:=mq+1;
putpixel(round((x*400))+50,450-round(y*400),12);
end
else begin mq:=mq+1;
putpixel(round((x*400))+50,450-round(y*400),14);
end;
end;
p:=p+4*(mk/mq);
end;
p:=p/anz2;
str(p:0:10,s);
s:=' PI = '+s;
settextstyle(1,horizdir,2);
outtextxy(100,10,s);
s:='';
str((((p/pi)-1)*100):0:5,s);
s:=s+' Prozent falsch';
settextstyle(15,horizdir,2);
outtextxy(350,20,s);
readln;
closegraph;
end.
Gastarbeiter 21:20, 26. Mär 2006 (CEST)

