Mathematica, 42 40 39 Bytes (oder 31/29?)
Ich habe drei Lösungen alle bei 42 Bytes:
4Count[1~RandomReal~{#,2},p_/;Norm@p<1]/#&
4Tr@Ceiling[1-Norm/@1~RandomReal~{#,2}]/#&
4Tr@Round[1.5-Norm/@1~RandomReal~{#,2}]/#&
Dies sind alle unbenannten Funktionen, die die Anzahl der Abtastwerte nmessen und eine rationale Approximation von π zurückgeben. Zunächst erzeugen sie alle nPunkte im Einheitsquadrat im positiven Quadranten. Dann bestimmen sie die Anzahl der Abtastwerte, die innerhalb des Einheitskreises liegen, und dividieren dann durch die Anzahl der Abtastwerte und multiplizieren mit 4. Der einzige Unterschied besteht darin, wie sie die Anzahl der Proben innerhalb des Einheitskreises bestimmen:
- Der erste verwendet
Countmit der Bedingung, dass Norm[p] < 1.
- Der zweite subtrahiert die Norm jedes Punktes
1und rundet dann auf. Dies dreht Zahlen innerhalb des Einheitenkreises nach 1und solche außerhalb nach 0. Danach fasse ich sie alle zusammen Tr.
- Die dritte Methode macht im Wesentlichen dasselbe, subtrahiert jedoch die von
1.5, sodass ich sie Roundanstelle von verwenden kann Ceiling.
Aaaaaund als ich das aufschrieb , kam mir der Gedanke , dass es tatsächlich eine kürzere Lösung gibt, wenn ich einfach subtrahiere 2und dann benutze Floor:
4Tr@Floor[2-Norm/@1~RandomReal~{#,2}]/#&
Oder speichern Sie ein anderes Byte mit den Unicode-Operatoren für Fußböden oder Decken:
4Tr@⌊2-Norm/@1~RandomReal~{#,2}⌋/#&
4Tr@⌈1-Norm/@1~RandomReal~{#,2}⌉/#&
Beachten Sie, dass die drei Runden-basierten Lösungen können auch mit geschrieben werden Meanstatt Trund ohne der /#wieder für das gleiche Bytes.
Wenn andere Monte-Carlo-basierte Ansätze in Ordnung sind (insbesondere der von Peter gewählte), kann ich 31 Bytes ausführen, indem ich das Integral von oder 29 unter Verwendung des Integrals von schätze . Diese Zeit wird als Gleitkommazahl angegeben:√(1-x2)1/(1+x2)
4Mean@Sqrt[1-1~RandomReal~#^2]&
Mean[4/(1+1~RandomReal~#^2)]&