Hallo zusammen,
dieser Thread geht auf diesen zurück.
Code:
Code
link graphics
$define X 250
$define Y 250
procedure main()
WOpen("pos=0,0", "size=800,400")
delay(2000)
area := list(X)
every j := 1 to Y do area[j] := list(Y, 0)
every i := 1 to X do
{
every writes(area[i, 1 to Y])
write()
}
count := 0
filled := 0
in := 0
out := 0
repeat
{
x := ?X
y := ?Y
count +:= 1
if area[x, y] = 0 then
{
area[x, y] := 1
filled +:= 1
}
if (x - real(X/2))^2 + (y - real(Y/2))^2 < (X/2)^2 then
{
in +:= 1
Fg("green")
}
else
{
out +:= 1
Fg("black")
}
DrawPoint(x,y)
write(count, "\t", x, "\t", y, "\t", filled, "\t", real(in) / real(count))
if filled = X * Y then break
}
write("Amount of loops: ", count)
write("4 *(In circle / loops): ", 4 * real(in) / real(count), "\t")
write("difference to pi: ", abs((&pi - 4 * real(in) / real(count))))
WDone()
end
Alles anzeigen
Code-Deutung:
Zeile | Deutung |
1 | Einbinden der Graphics-Library (für alles, was auf Fenstern passiert) |
2-3 | zwei globale Variablen (geben die Dimension des auszuwertenden Bereiches ein. Die Auswertung erfolgt sowohl numerisch als auch graphisch) |
6 | Haupteintrittspunkt |
7 | Öffnet ein Fenster an der Position mit der Größe |
9-10 | Hm ... erzeuigt ein zweiduimensionales Array - ich hätte hierfür auch eine andere Library einbinden können. Aber letztlich stecken diese beiden Zeilen dahinter. In Zeile 9 wird ein Spaltenvektor aufgespannt. In Zeile 10 wird jedes Spaltenelement mit einem Zeilenvektor belegt. Ergebnis ist dann eine X*Y-Matrix. Die 0 in Zeile 10 ist der Initialisierungswert. Hätte ich auch weglassen können. |
12-16 | gibt den Inhalt der Matrix aus - Ergebnis ist eine 0-Matrix der Dimension X*Y |
18-21 | Initialisieren einige Zählvariablen |
23 | Starten einer Endlosschleife, die nur durch Erfüllen der Bedingung in Zeile 51 abgebrochen werden kann |
25-26 | ? ist der Zufallszahlen -Operator. In diesen beiden Zeilen werden also zwei Zufallszahlen im Bereich 1 bis X und 1 bis Y ermittelt und den Variablen x und y zugewiesen |
28 | Zählt die Anzahl der Schleifendurchläufe |
30-34 | Prüft, ob die Kombination x,y erstmals vorliegt. Falls ja, wird das entsprechende Matrix-element gesetzt und der Zähler filled hochgezählt. |
35-39 | Falls der Punkt (x | y) innerhalb eines Kreises mit Mittelpunkt (X/2 | Y/2) und Radius X/2 = Y/2 liegt, dann wird die Vordergrundfabe auf grün gesetzt und ein Zähler hochgezählt. |
40-44 | Anderenfalls wird ein anderer Zähler hochgezählt und die Vordergrundfarbe auf schwarz gesetzt |
45 | Der Punkt an der Position (x | y) wird jetzt tatsächlich in der gesetzten Vordergrundfarbe gemalt. |
47 | Ausgabe einiger interessanter Informationen |
49 | Abbruchbedingung: Wenn alle Elemente der Matrix gesetzt sind = alle Punkte in der Graphik auf grün oder schwarz gesetzt sind |
51-54 | Ausgabe zusammenfassender Informationen. Wie ich in dem anderen Thread schon angedeutet habe, ist das Verhältnis von Zufallspunkte im Kreis zur Anzahl aller Punkte wie pi : 4. Die Zahl in der rechten Spalte von Zeile 49 ist somit pi/4. Da ich hier die Qualität der Zufallszahlen ermitteln will, verwende ich die Versuche, die innerhalb des Kreises gelandet sind (auch wenn mehrmals der gleiche Punkt getroffen wird) zur Anzahl der Schleifendurchläufe. Die Übereinstimmung mit pi/4 bzw. das Vierfache davon abzgl. pi ist dann ein Maß für die Gleichverteilung der hiermit ermittelten Zufallszahlen. Dieses Maß hängt aber vom Seed ab, der mit &random := gesetzt werden kann. Die Übereinstimmung mit pi = 3,1415... ist schon mal nicht schlecht. |
Programm-Ausgabe (die letzten 4 Zeilen):
766452 168 150 62500 0.7850524234
Amount of loops: 766452
4 *(In circle / loops): 3.140209693
difference to pi: 0.001382960093
Graphische Ausgabe (250 x 250-Matrix)
Man erkennt, dass alle Pixel gesetzt sind und dass die grünen Punkte innerhalb eines Kreises liegen.
Beste Grüße
Andreas